Generare dinamicamente le voci dell'host SSH in ~ / .ssh / config


9

Devo amministrare un mucchio di host su SSH. Tuttavia, posso accedervi solo tramite un determinato server ssh gateway.

Ho il seguente nel mio ~/.ssh/config:

Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

Tuttavia, devo collegarmi a molte di queste macchine. Invece di inserire dozzine di voci nel mio ~/.ssh/config, c'è comunque che posso avere qualcosa del genere:

Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

So che puoi usare %hl' Hostnameargomento, ma sarebbe il nome host. Ciò di cui ho davvero bisogno è una sorta di sostituzione delle stringhe, come quella di Bash ${VAR%thingie}. È possibile?

Risposte:


24

Questo può essere fatto con il seguente file di configurazione SSH:

Host *
  ServerAliveInterval 120

Host gateway.somewhere.com
  User jdoe

Host gateway+*
  User jdoe
  ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null
  ControlMaster auto
  ControlPath ~/.ssh/ssh-control_%r@%h:%p

Quindi accedi ai tuoi host interni in questo modo:

ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com

Il nome scelto per la metà destra dovrebbe essere risolvibile dall'host di salto.

Il parametro User è specificato nel caso in cui sia necessario mappare manualmente a utenti diversi sulle diverse classi di host. ControlMaster e ControlPath sono specificati per consentire il riutilizzo della connessione SSH.


6

Non è necessario specificare manualmente HostName poiché verrà dalla riga di comando.

Prova semplicemente:

Host *.domain  
  IdentityFile ~/.ssh/id_rsa  
  ProxyCommand ssh mygateway /usr/bin/nc %h 22

Il problema con questo approccio è che il nome host è piuttosto generico (ad es. Db1, www, mail2), mentre io voglio che vengano prefissati anche con il progetto, dal momento che potrei aver bisogno di ssh su una macchina diversa chiamata 'db2'. Da qui il prefisso in Host
Rory,

2
Quindi in realtà vuoi riconfigurare il tuo DNS. La soluzione più semplice (ma la più ingombrante) è quella di modificare il file hosts. D'altra parte, è sempre possibile aggiungere un server DNS locale alla workstation con un dominio .invalid e utilizzare i nomi host che si preferiscono.
Martin M.

+1 al precedente. Crea un sottodominio per ogni progetto. DNS è lì per semplificarti la vita;)
Dan Carley,

1

Sembra che non ci sia modo di farlo.


1

Ho avuto un problema simile e ho finito per scrivere una sceneggiatura che ha generato per me tutta la piastra. Non cambio più ~ / ssh / config, cambio ~ / ssh / config.in e rieseguo il mio script.


1
Vuoi condividere la tua sceneggiatura? Ho pensato di farlo, ma sembra che una soluzione solida e generica potrebbe richiedere molto lavoro per essere corretta. Anche se la tua soluzione non è ancora quella, sarebbe utile sapere cosa pensi che vada bene e cosa faresti diversamente se dovessi farlo.
iconoclasta

Il mio pensiero era di avere .ssh/config.dun file per ogni modello, in cui ogni modello avrebbe generato una o più voci nel finale ~/.ssh/config. Ci sarebbe anche un file con variabili universali, ma ogni modello potrebbe avere le sue variabili che avrebbero la precedenza sui globali, elencati in alto. Il ~/.ssh/configfile potrebbe essere generato su richiesta o in base a una pianificazione, non importa, a condizione che non si siano mai apportate modifiche dirette che si desidera conservare.
iconoclasta il

La mia sceneggiatura è totalmente priva di documenti e non credo che sarebbe comprensibile senza documentazione o esempi, che non ho tempo di creare.
Michael Hoffman,

Comprensibile. Qualsiasi feedback sull'approccio che ho delineato sarebbe apprezzato, specialmente se sto trascurando qualche necessità importante o caso d'uso, oppure alcuni grandi (o piccoli) ostacoli.
iconoclasta il

1
Penso che sia un approccio eccellente, probabilmente un po 'meno confuso rispetto all'approccio che ho usato. Ho letto un numero di dichiarazioni dell'host in memoria, quindi un numero di dichiarazioni non host. Le dichiarazioni non host vengono applicate a ciascun host nel gruppo corrente fino a quando non esiste un altro host. Consento anche agli host di essere dichiarati più volte nel file, incluso l'uso del globbing. Alla fine scrivo tutto ciò che ho costruito in memoria.
Michael Hoffman,

1

Ignora la specifica di sovrascrivere il nome host direttamente tramite la Hostnamedichiarazione e determinalo invece in fase di esecuzione. Fallo valutandolo come parte di ProxyCommand, usando %hcome riferimento nel comando (usa anche %pinvece di hardcoding port come 22) ie

Host mygateway-*
   #Hostname ???WHAT GOES HERE????
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc $(echo %h|sed 's/^mygateway-//') %p

Si potrebbe anche avere una stanza più generica, per cui è possibile specificare qualsiasi host senza -essere trattato così com'è, o secondo un'altra stanza / e corrispondente, ma avere un -approccio generico per specificare qualsiasi <gateway>-<target>:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh $(echo %h|cut -d - -f1) nc $(echo %h|cut -d - -f2-) %p

Inoltre, le versioni più recenti del client SSH supportano l' [-W host:port]opzione per eseguire direttamente la stessa funzione di nc(netcat). Come tale, possiamo usare il modificato:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh -W $(echo %h|cut -d - -f2-):%p $(echo %h|cut -d - -f1)

Naturalmente, se avessi un elenco finito di host, potresti sempre fare:

Host host1 host2 host3 hostN
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc %h %p

Spero che sia di aiuto!


0

Avevo un client con la stessa configurazione e ho usato DSSH per risolvere il mio problema.
DSSH, tra le altre cose, ti consente di accedere in modo trasparente agli host remoti tramite un host gateway.

Casi d'uso

  • Raccogliere i parametri di configurazione dai router Cisco che richiedono l'accesso "ena"
  • Accedi ai server che hanno PermitRootLogin disabilitato direttamente come root (digitando su - e password automaticamente), mantenendo lo stato di uscita
  • Aggiungi logica personalizzata come la registrazione avanzata
  • tunnel attraverso diverse connessioni per arrivare al server di destinazione

5
Preferirei non iniziare a usare qualche client ssh di terze parti casuale che utilizza Java, per cose che posso fare in ~ / .ssh / config.
Rory,

il collegamento è morto
iconoclasta il

La fonte del software è disponibile su Github: github.com/digmia/dssh
Ospite
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.