SSH in einer Zeile

27

Wie würde ich über SSH in einer Zeile eine Verbindung zu einem anderen Computer herstellen? In ssh host@IPdiesem Fall müsste ich das Passwort in der zweiten Zeile eingeben. Ich dachte, dass ich so etwas tun könnte ssh host@IP | echo password, aber das gibt das Passwort ein, bevor ich nach dem Passwort frage.

Ben A.
quelle
3
Diese Art des Denkens stammt aus der Zeit von Telnet und ist zu erwarten, als das Internet noch sicherer war. Allens Antwort ist richtig, Jakujes Antwort ist technisch richtig, aber an den meisten Stellen nicht das Werkzeug für den Job.
Criggie
3
Dies ist eine gute Frage zum Einrichten der passwortlosen Anmeldung. Ich bitte Sie, Ihre akzeptierte Antwort erneut zu lesen. Die Antwort von Jakuje ist richtig und wird funktionieren. Der richtige Weg, dies zu tun, ist mit SSH-Schlüsseln, wie in Allans Antwort beschrieben.
Scot
Wenn sshdas Passwort von stdin gelesen würde, echo password | ssh host@IPwürde es funktionieren, aber normalerweise versucht SSH, direkt vom Terminal zu lesen.
Paŭlo Ebermann,

Antworten:

82

Sie sollten SSH-Schlüssel verwenden, um sich zu authentifizieren, anstatt Ihr Kennwort in die Befehlszeile einzugeben, da es äußerst unsicher ist.

Sobald Sie Ihre SSH-Schlüssel eingerichtet haben, müssen Sie nur noch den folgenden Befehl eingeben:

ssh user@host

und ohne etwas anderes einzugeben, wirst du automatisch eingeloggt.


Kopieren Sie den öffentlichen SSH-Schlüssel von macOS nach Mac / FreeBSD / Linux

Dies setzt voraus, dass Sie über eine kennwortbasierte Authentifizierung (Eingabe eines Kennworts) auf den Remote-Server zugreifen können und dass Sie bereits Ihr privates / öffentliches Schlüsselpaar erstellt haben (falls nicht, siehe unten). Im folgenden Beispiel verwenden wir RSA. Kopieren wir zunächst den Schlüssel (beachten Sie, dass das "Home" -Verzeichnis sich zwischen MacOS, Linux, BSD usw. unterscheidet):

Verwendung von SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

Oder ziehen Sie einfach die Datei an authorized_keys(ich bevorzuge diese Methode):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(Ihr Schlüsselname kann abweichen) Wenn das Verzeichnis .ssh auf dem Remote-Server nicht vorhanden ist, müssen Sie sich anmelden und es erstellen.

Jetzt wurde der Schlüssel vom Mac auf den Remote- Server kopiert . Richtigen Sie die Berechtigungen für den öffentlichen SSH-Schlüssel auf dem Remoteserver ein:

chmod 600  ~/.ssh/id_rsa.pub

Fügen Sie als Nächstes den Schlüssel zur SSH-Datei authorized_keys hinzu, falls die Datei noch nicht vorhanden ist, und erstellen Sie sie.

Wenn die Datei authorized_keysin der Datei bereits vorhanden ist, ~/.sshverwenden Sie den folgenden Befehl:

cat id_rsa.pub >> authorized_keys

Wenn die Datei nicht existiert, geben Sie die folgenden Befehle ein:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Generieren Sie einen öffentlichen / privaten SSH-Schlüssel unter macOS

Öffnen Sie das Terminal über Anwendungen -> Dienstprogramme -> Terminal

Verwenden Sie im Terminal den folgenden Befehl, um die Schlüsselerzeugung zu starten

ssh-keygen -t rsa

Als Nächstes werden Sie aufgefordert, den Speicherort anzugeben, an dem Sie die private Schlüsseldatei erstellen möchten:

Geben Sie die Datei ein, in der der Schlüssel gespeichert werden soll ( /Users/username/.ssh/id_rsa):

Lassen Sie dieses Feld leer, um den Schlüssel am Standardspeicherort zu erstellen /Users/username/.ssh/id_rsa. Die öffentliche Schlüsseldatei wird am selben Speicherort und mit demselben Namen erstellt, jedoch mit der Erweiterung .PUB.

Nachdem Sie aufgefordert werden, eine Passphrase zu wählen. Dies ist das optionale Kennwort , um den privaten Schlüssel zu verwenden.

Enter passphrase (empty for no passphrase):

Ihr SSH-Schlüssel wird generiert.

Denken Sie jetzt daran, wenn Sie ein Passwort eingeben, müssen Sie es jedes Mal eingeben, wenn Sie eine Verbindung herstellen. Das Dienstprogramm ssh-agentbehält die Passphrase im Speicher, sodass Sie sie nicht jedes Mal manuell eingeben müssen, wenn Sie eine Verbindung herstellen, während Sie sich in derselben Sitzung befinden. Weitere Details finden Sie unterman ssh-agent

Allan
quelle
6
Absolut das - Schlüssel können und sollten Passwörter für jeden SSH-Zugang über das Internet komplett ersetzen. Ich würde vorschlagen, dass Sie den Bedarf an Sicherheit für den privaten Schlüssel erweitern, damit er nicht auf all Ihren Computern herumliegt.
Criggie
+1 Dies ist eine wirklich gute Antwort, nicht nur aufgrund dessen, was darin steht, sondern auch aufgrund dessen, wie Sie es erklärt haben. Alles, was für Benutzer einfacher zu befolgen ist und ihnen hilft, sicherer zu sein, ist ein Plus in meinen Büchern!
Monomeeth
7
Gute Antwort. Ich wollte nur hinzufügen, dass dies ssh-copy-idein nützliches Tool ist, um einige der oben genannten Vorgänge zu automatisieren.
Scot
Eine Erwähnung von ssh-agent könnte ebenfalls hilfreich sein. Die meisten (alle?) Versionen von OS X / macOS werden mitgeliefert und ermöglichen die Anmeldung ohne Kennwort, auch wenn der Schlüssel kennwortgeschützt ist.
Qsigma
1
@Scot - ist standardmäßig nicht Bestandteil von macOS und muss über Homebrew oder MacPorts installiert werden . Ich bin kein Fan der Installation von Software, denn Dinge können in einer Zeile oder einem kurzen, selbstgeschriebenen Skript ausgeführt werden, und aus diesen Gründen dachte ich, dass dies außerhalb des Rahmens der Antwort liegt. Es ist jedoch ein gutes kleines Hilfsprogramm und erwähnenswert.
Allan
13

Es gibt verschiedene Möglichkeiten. Ihr Beispiel wird natürlich nicht funktionieren, aber Sie können mit dem sshpassDienstprogramm etwas Ähnliches erreichen :

sshpass -p password ssh host@IP

Beachten Sie, dass dies nicht empfohlen wird, da passworddies für andere Prozesse oder im Shell-Verlauf sichtbar ist.

Eine viel bessere Möglichkeit ist es, die kennwortlose Authentifizierung mit SSH-Schlüsseln einzurichten. Zusamenfassend:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP
Jakuje
quelle
Ich habe das ausprobiert, sshpasswie Sie es empfohlen haben, aber es wurde der Befehl nicht gefunden.
Ben A.
8
Nun ... Sie müssen es wahrscheinlich installieren. Und nein, ich empfehle es nicht. Richten Sie die kennwortlose Authentifizierung mit ssh-Schlüsseln ein.
Jakuje,
4
@BenA. Richten Sie die kennwortlose Authentifizierung ein, indem Sie ein öffentliches / privates Tastenfeld definieren und auf beiden beteiligten Computern einrichten. Das ist viel einfacher (und sogar sicherer) als jedes
andere
8
Tausendmal nein. sshpass ist ein schmutziger Hack, der zum Herstellen einer Verbindung zu Geräten verwendet wird, die ssh sprechen, aber die Schlüssel nicht richtig ausführen. Die Hauptverwendung sind Setup-Skripte. Sie würden sshpass nicht auf einem Mehrbenutzer-Computer verwenden ps auxw | grep sshpass , um anderen Benutzern das ssh-Passwort mitzuteilen.
Criggie
1
@Criggie, nicht ganz. Ich bin zwar zu 100% hinter der schlüsselbasierten Lösung zurückgeblieben, habe aber einige nur interne Himbeer-Pis (für zufällige Aufgaben und den Zugriff durch zufällige Clients; das Weitergeben von Schlüsseln nur für den internen Gebrauch ist mühsam). Ihr Befehl ausführen gibt die folgende Ausgabe: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh [email protected]. Das zzzzzzzzist wörtlich; sshpass maskiert den Inhalt des Passworts. Vielleicht waren frühere Iterationen weniger datenschutzbewusst.
Flith
3

Ich habe auch lange nach der Antwort darauf gesucht. Obwohl es unsicher ist und all diese Leute Sie auffordern, RSA-Schlüssel zu verwenden ( was eine sicherere und zuverlässigere Idee ist ), ist es durchaus möglich.

Verwenden Sie dazu ein Programm expect. Expect überwacht stdout (und ich denke stderr, wenn es richtig konfiguriert ist) für Sie, wartet auf bestimmte Nachrichten und antwortet auf diese mit Ausgabe. Erwarten Sie, dass es sich tatsächlich um eine Skriptsprache handelt, und als ich das Gleiche tat, fiel es mir aufgrund des Timings sehr schwer, mein eigenes Skript richtig zum Laufen zu bringen. Allerdings beinhaltet expect auch ein praktisches Hilfsprogramm namens autoexpect.

Mit autoexpect werden Sie überwacht und ein Erwartungsskript für Sie erstellt. Führen Sie einfach autoexpect und den gewünschten Befehl aus:

autoexpect ssh host@ip 

und mach was du normalerweise machst. Wenn Sie das Programm exitbeenden (durch Eingabe der Shell ssh'd), wird das Skript generiert. Wenn Sie nicht möchten, dass sich das gesamte Skript, das Sie schreiben, in einem Expect-Skript befindet, können Sie das Skript von autoexpect (aufgerufen script.exp) bis zum Beenden bearbeiten , bevor Sie den exitBefehl in die Shell eingeben . Die Zeile, die Sie verschieben möchten, um das Skriptende zu ändern, lautet:

expect eof

was bedeutet, dass das Dateiende erwartet wird. Hoffe das hilft!

Allan
quelle
1
Falls es noch niemand gesagt hat: Willkommen bei Ask Different!
Synoli
2

Die Verwendung von expectist einfach falsch, um sich für etwas anderes als in einer Testsuite bei einer ssh-Verbindung anzumelden.

Was @ ben-a sucht, ist bereits in ssh implementiert. Der Trick ist, wie man es benutzt. Also los geht's:

  1. Generieren Sie ein öffentliches / privates Schlüsselpaar mit ssh-keygen. Verwenden Sie entweder ECDSA oder RSA als -t(oder Typ) und für RSA 2048 oder 4096 als -b(oder BITS-Länge). Dies sollte zum Zeitpunkt des Schreibens ausreichen. Verwenden Sie IMMER ein PASSWORT!
  2. Verwenden Sie die ssh-copy-idoder die oben genannte Methode, um auf dem Computer, auf dem Sie sich anmelden (auch bekannt als Server), die ~/.ssh/authorized_keysDatei zu erstellen. Darin befindet sich eine Kopie des soeben generierten öffentlichen Schlüssels.
  3. Nun öffnen Sie auf dem Computer, auf dem Sie sich beim 'Server' (oder Client) anmelden, die Datei ~/.ssh/config. Wenn es nicht existiert, können Sie es erstellen.
  4. In dieser Datei fügen Sie Folgendes für Ihre Anforderungen hinzu

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. Sie können ssh <name>die Verbindung jetzt nur zum Einrichten verwenden, das Kennwort für Ihren Schlüssel wird jedoch weiterhin benötigt. Um dies zu lösen, verwenden Sie den für diesen Zweck entwickelten und mitgelieferten ssh-Agent. Um Ihren Schlüssel zum Agenten hinzuzufügen, verwenden Sie einfach ssh-add <path to keyfile>. Sie werden nach dem Kennwort gefragt, und der Schlüssel wird für diese Sitzung sicher gespeichert. Wenn der Fehler "Der ssh-Agent kann nicht gefunden werden" (oder ähnlich) angezeigt wird, bedeutet dies, dass der Agent wahrscheinlich noch nicht gestartet wurde. Sie können es für diese Sitzung mit starten ssh-agent bash. Dadurch wird eine neue Shell mit dem darin aktiven Agenten gestartet.

Wenn Sie diese Schritte ausführen, erschweren Sie nicht nur den Identitätswechsel durch die Entführung Ihrer Anmeldeinformationen, sondern sorgen auch für eine ordnungsgemäße Benutzerfreundlichkeit (die einfacher zu verwenden ist als einfache Kennwörter).

LvB
quelle