Un host .ssh / config può avere più voci HostName?


10

Ho impostato il port forwarding per ssh e router in modo da poter accedere a un computer sulla mia rete domestica quando non sono a casa. Attualmente ho due voci nel mio .ssh/configfile una per quando sono sulla mia rete domestica e una per quando non lo sono:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

Funziona ma mi chiedo se posso rendere le cose più facili per me stesso. Speravo che ci fosse un modo per elencare più voci HostName in modo tale che se la prima fallisce, ricada nella seconda:

Host mycomputer
  HostName 192.168.X.X
  HostName my.no-ip.dynamic

In questo modo proverà prima a connettersi a un host sulla mia rete locale e, se ciò non è presente, proverà a connettersi utilizzando il mio nome host dinamico no-ip. Ho provato a inserire due nomi host ma eseguendo ssh mycomputersolo blocchi senza fare nulla.

Ho disattivato l'autenticazione della password a favore delle chiavi, quindi la connessione accidentale a un computer sulla rete locale quando non sono sulla mia rete domestica non dovrebbe rischiare che la mia password vada ovunque non dovrebbe.

È possibile specificare i nomi host di fallback da provare se il primo non funziona?


unix.stackexchange.com/questions/424755/… è simile e probabilmente può essere adattato per nome host anziché porta
thrig

A proposito, è .ssh/configpossibile eseguire script per determinate proprietà. So che puoi con ProxyCommand. Potresti fare qualcosa come mostrato in queste domande e risposte da SF - serverfault.com/questions/401233/… .
slm

Risposte:


8

È brutto, ma penso che potresti farlo usando il execcriterio Matchsullo stato di uscita di un bussare alla porta, ad es

Host mycomputer
  Match exec "nc -z 192.168.1.11 %p"
    HostName 192.168.1.11
  Match !exec "nc -z 192.168.1.11 %p"
    HostName my.no-ip.dynamic

Nota che questo non può davvero dire se sei sulla "tua" rete domestica - solo che sei su un segmento LAN privato con lo stesso intervallo di indirizzi che ha un servizio in ascolto sullo stesso indirizzo / porta.


1
Ho dovuto aggiungere un -w 1altrimenti ncsembrava aspettare per sempre. Quello che potrebbe essere più semplice è la seconda partita possibile Match exec "true"perché se la prima partita fallisce, prova ciecamente la seconda scelta.
Corey Ogburn,

@CoreyOgburn ah sì, stavo cercando di pensare a un modo migliore per fare la condizione alternativa (peccato Matchnon avere Else)
Steeldriver

Quindi ho riscontrato un problema con questo approccio. Ho anche eseguire un sito, dire xyz.com, e quando ho provato a ssh xyz.commia Match exec "true"pescato quel e mi ha indirizzato nel mio assistente a casa utilizzando il mio nome host remoto. Proverò con il tuo dirigente ma penso che accadrà la stessa cosa.
Corey Ogburn,

Sì, l'utilizzo di your Match exec... Match !execsta causando ssh'ing ad altri domini per attivare Match !exece riscrivere il nome host.
Corey Ogburn,

2
Quindi si scopre che ~/.ssh/confignon potrebbe importare di meno del rientro. Alcuni comandi ripristinano l'ambito, ovvero ogni nuova riga dell'host dice "le righe precedenti erano per l'host precedente, le righe seguenti sono per questo nuovo host". Si scopre che Matchha lo stesso potere di "ripristino dell'ambito" di Host. Per tener conto di ciò, ho sostituito la mia linea Host con Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"e definito tutti i valori personalizzati per la mia rete locale. Ho quindi aggiunto una riga corrispondente tranne !exece ho aggiunto tutti i valori per quando sono fuori rete. Ora funziona benissimo per tutti gli host.
Corey Ogburn,

2

Sto usando così.

Match host mycomputer exec "nc -G 1 -z 192.168.1.11 %p"
    HostName 192.168.1.11
Match host mycomputer # fallback
    HostName my.no-ip.dynamic
Host mycomputer
    # ... other configs

Host not-my-computer
# ... other configs

ssh_config non ha qualcosa come il blocco di rientro. Se si desidera limitare la frase di corrispondenza a un host specifico, è necessario descrivere la condizione completa.

Puoi evitare l'attesa prolungata ncassegnando l' -G 1opzione (timeout connessione 1s) e puoi utilizzare il seguente comportamento per evitare l'invocazione multipla dinc

Abbina
Introduce un blocco condizionale. Se tutti i criteri sulla riga di corrispondenza sono soddisfatti, le parole chiave nelle righe seguenti hanno la precedenza su quelle impostate nella sezione globale del file di configurazione, fino a quando non viene trovata un'altra riga di corrispondenza o la fine del file. Se una parola chiave appare in più blocchi Match che sono soddisfatti, viene applicata solo la prima istanza della parola chiave.

https://www.freebsd.org/cgi/man.cgi?sshd_config(5)


1

No; se si specificano più HostNames per una Hostvoce, verrà riconosciuta solo la prima:

$ grep -A5 Host .ssh/config
Host test
   HostName fake.tld.xyzzy
   HostName real.example.com
   HostName 127.1.2.3
   User username
$ ssh test
ssh: Could not resolve hostname fake.tld.xyzzy: Name or service not known

Immagino abbia senso. Se lo digito ssh mycomputer, dovrebbe essere abbastanza chiaro il computer a cui mi sto collegando.
Corey Ogburn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.