Come aggiungere un host conosciuto SSH in uno script bash?


13

Sto creando uno script bash per eseguire il provisioning di un nuovo server su cui posso distribuire un'applicazione Web. Una cosa che devo sempre fare è utilizzare GitHub come un host noto ssh git@github.com. Come posso automatizzare questo processo in uno script bash e farlo in modo idempotente?

Risposte:


17

Il modo semplice per andare sarebbe fare qualcosa del genere.

ssh-keyscan remote_server >>~/.ssh/known_hosts

Se questa casella è nuova potrebbe essere necessario creare anche la ~/.sshdirectory prima di eseguire ssh-keyscan .

Tieni presente che ssh-keyscan può accettare un numero arbitrario di nomi host. Riceverà tutte le chiavi che può.


1
PS: per il provisioning dovresti usare qualcosa di simile a un pupazzo anziché uno script bash. Per le marionette questo potrebbe essere facilmente gestito con la risorsa sshkey . Vedi anche questa domanda per un metodo per gestire l'en-masse server
Zoredache,

2
Mi è sembrato sicuramente buono, ma dopo aver trascorso alcune ore a testa su marionette e concorrenti, sono tornato di corsa alle sceneggiature e al buonsenso. Se quegli strumenti sono intuitivi, apparentemente non ho intuizione. YMMV.
Ron Burk,

Usa bash. Mi imbatto costantemente in problemi in diverse versioni di cose come pupazzo o ansible. Torniamo sempre a bash ... 3 aziende che gestiscono ora in questo modo e bash è sempre affidabile per noi.
Ligemer,

4

Stai cercando di automatizzare l'accettazione della nuova chiave? In tal caso, è possibile utilizzare -oStrictHostKeyChecking = no.
Farlo è una pessima idea dato che ora sei completamente aperto agli attacchi man-in-the-middle.

Un'opzione migliore sarebbe solo quella di gestire un file known_hosts e riutilizzarlo quando si esegue il provisioning di nuovi server. Attaccalo su github e scrivi un semplice script per scaricare quel file prima di lanciarlo in github.

Il rigoroso controllo della chiave host è una buona cosa.


Puoi approfondire il "gestire il file known_hosts"? Penso che sia quello che voglio fare, ma quando ho visto il file, il suo contenuto sembrava una specie di hash / chiave e non sembrava qualcosa che doveva essere gestito manualmente.
Andrew,

2
Effettua il provisioning di un nuovo server, manualmente ssh in github come faresti tu. Accetta la chiave host quando richiesto. Disconnettersi. Copia ~ / .ssh / known_hosts da quel server appena fornito altrove (github, web server, non importa finché puoi ottenerlo). La prossima volta che esegui il provisioning di un server, copia quel file prima di inviarlo a github. Non è necessario modificare il file.
Yoonix,

È meglio della mia risposta (più sicura). Un ulteriore miglioramento della risposta di yoonix è però l'analisi di "ssh-keyscan github.com" e la memorizzazione della chiave restituita in ~ / .ssh / known_hosts in questo modo non è statica in un file da qualche parte per cui è necessario aggiornare.
Sirex,

Funzionerebbe anche quello, ma non lo considero migliore. Ti stai potenzialmente preparando per un attacco man-in-the-middle se prendi una nuova chiave host ogni volta.
Yoonix,

1
Per chiarire il mio ultimo commento (troppo tardi per modificarlo): prendere una nuova chiave host ogni volta che si effettua il provisioning di un host non è funzionalmente diverso dall'impostazione di StrictHostKeyChecking = no. Con entrambi, ti fidi ciecamente di qualsiasi chiave venga inviata ogni volta che effettui il provisioning. Se ritieni improbabile un attacco MITM, leggi questi due articoli. Github sarebbe un bersaglio ENORME.
Yoonix,

1

Non sono sicuro di aver capito la domanda, ma penso che tu voglia ignorare il prompt known_host o evitarlo del tutto, nel qual caso:

ssh -o StrictHostKeyChecking = no

o altri suggerimenti su: http://www.joedog.org/2012/07/ssh-disable-known_hosts-prompt/


Voglio un modo non interattivo di accettare la chiave host GitHub (poiché ciò avverrà in uno script bash).
Andrew,

allora funzionerà: non accetterà la chiave, la ignorerà del tutto. La risposta di Yoonix è migliore
Sirex il
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.