Wie füge ich einen bekannten SSH-Host in ein Bash-Skript ein?

13

Ich erstelle ein Bash-Skript, um einen neuen Server bereitzustellen, auf dem ich eine Webanwendung bereitstellen kann. Eine Sache, die ich immer tun muss, ist, GitHub als bekannten Host zu verwenden ssh [email protected]. Wie kann ich diesen Prozess in einem Bash-Skript automatisieren und auf eine idempotente Weise ausführen?

Andrew
quelle

Antworten:

17

Der einfache Weg wäre, so etwas zu tun.

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

Wenn dieses Feld brandneu ist, müssen Sie möglicherweise auch das ~/.sshVerzeichnis erstellen, bevor Sie ssh-keyscan ausführen .

Denken Sie daran, dass ssh-keyscan eine beliebige Anzahl von Hostnamen annehmen kann. Es wird alle Schlüssel bekommen, die es kann.

Zoredache
quelle
1
PS: Für die Bereitstellung sollten Sie anstelle eines Bash-Skripts eine Marionette verwenden. Für Puppet könnte dies leicht mit der sshkey- Ressource gehandhabt werden . In dieser Frage finden Sie auch eine Methode zum Verwalten der bekannten_Hosts unter serverfault.com/a/416782/984
Zoredache,
2
Das hörte sich gut für mich an, aber nachdem ich ein paar Stunden pro Person mit Puppen und Konkurrenten verbracht hatte, eilte ich zurück, um Skripte und Vernunft zu finden. Wenn diese Werkzeuge intuitiv sind, habe ich anscheinend keine Intuition. YMMV.
Ron Burk
Benutze bash. Ich habe ständig Probleme mit verschiedenen Versionen von Dingen wie Marionette oder Ansible. Wir gehen immer zurück zur Bash ... 3 Unternehmen laufen jetzt so und Bash ist für uns immer zuverlässig.
Ligemer
4

Versuchen Sie, das Akzeptieren des neuen Schlüssels zu automatisieren? In diesem Fall können Sie -oStrictHostKeyChecking = no verwenden.
Dies zu tun ist eine sehr schlechte Idee, da Sie jetzt völlig offen für Man-in-the-Middle-Angriffe sind.

Eine bessere Option wäre, eine Datei mit dem Namen "known_hosts" zu verwalten und diese Datei bei der Bereitstellung neuer Server erneut zu verwenden. Haften Sie es auf Github und schreiben Sie ein einfaches Skript, um diese Datei herunterzuladen, bevor Sie in Github sshing.

Die strikte Überprüfung des Host-Schlüssels ist eine gute Sache.

yoonix
quelle
Können Sie die Datei "known_hosts verwalten" näher erläutern? Ich denke, das ist, was ich tun möchte, aber als ich die Datei ansah, sah der Inhalt wie eine Art Hash / Schlüssel aus und sah nicht wie etwas aus, das manuell verwaltet werden sollte.
Andrew
2
Stellen Sie einen neuen Server bereit, ssh manuell in github, wie Sie es tun würden. Akzeptieren Sie den Host-Schlüssel, wenn Sie dazu aufgefordert werden. Ausloggen. Kopieren Sie ~ / .ssh / known_hosts von diesem neu bereitgestellten Server an eine andere Stelle (Github, Webserver, spielt keine Rolle, solange Sie ihn erhalten können). Wenn Sie das nächste Mal einen Server bereitstellen, kopieren Sie diese Datei zurück, bevor Sie sie an github senden. Sie müssen die Datei nicht bearbeiten.
Yoonix
Das ist besser als meine Antwort (sicherer). Eine weitere Verbesserung der Antwort von yoonix besteht darin, 'ssh-keyscan github.com' zu analysieren und den zurückgegebenen Schlüssel in ~ / .ssh / known_hosts zu speichern, sodass er nicht statisch in einer Datei ist, die Sie aktualisieren müssen.
Sirex
Das würde auch funktionieren, aber ich würde es nicht besser finden. Sie können sich auf einen Man-in-the-Middle-Angriff einstellen, wenn Sie sich jedes Mal einen neuen Host-Schlüssel schnappen.
Yoonix
1
Um meinen letzten Kommentar zu verdeutlichen (zu spät zum Bearbeiten): Es unterscheidet sich funktional nicht von der Einstellung von StrictHostKeyChecking = no, bei jeder Bereitstellung eines Hosts einen neuen Host-Schlüssel zu erfassen. Mit beiden vertrauen Sie blind auf den Schlüssel, der bei jeder Bereitstellung gesendet wird. Wenn Sie der Meinung sind, dass ein MITM-Angriff unwahrscheinlich ist, lesen Sie diese beiden Artikel. Github wäre ein RIESIGES Ziel.
Yoonix
1

Ich bin nicht sicher, ob ich die Frage verstehe, aber ich denke, Sie möchten die Eingabeaufforderung known_host ignorieren oder ganz vermeiden. In diesem Fall:

ssh -o StrictHostKeyChecking = no

oder andere Vorschläge unter: http://www.joedog.org/2012/07/ssh-disable-known_hosts-prompt/

Sirex
quelle
Ich möchte eine nicht interaktive Möglichkeit zum Akzeptieren des GitHub-Hostschlüssels (da dies in einem Bash-Skript geschieht).
Andrew
dann funktioniert das - der Schlüssel wird jedoch nicht akzeptiert, er wird vollständig ignoriert. Yoonixs Antwort ist besser
Sirex