Kann ich mich mit Passwörtern aus dem OS X-Schlüsselbund automatisch bei ssh anmelden?

9

Ich muss mich bei einem SSH-Server anmelden, der keine schlüsselbasierte Authentifizierung unterstützt. Und ich möchte die Passwörter nicht jedes Mal eingeben.

Ich verwende OS X Lion (10.7.2). Ich habe die Passwörter zum OS X-Schlüsselbund hinzugefügt [1]. Jetzt kann ich das Passwort automatisch mit aus dem Schlüsselbund abrufen /usr/bin/security, kann jedoch kein Passwort an die SSH-Eingabeaufforderung senden.

Ich habe es auch versucht sshpass. Wenn ich jedoch versuche, es auszuführen, wird ssh mit dem folgenden Fehler beendet:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

Kann ich mich trotzdem bei diesem Server anmelden, ohne jedes Mal das Passwort eingeben zu müssen?

Anmerkungen

  1. Das Schema, das ich im Schlüsselbund verwende, sieht so aus
    • Art: Internet-Passwort
    • Benutzername
    • Wobei: ssh: // Servername
Chaitanya Gupta
quelle

Antworten:

11

Nicht interaktive SSH-Sitzungen

Wenn Sie keine interaktive Sitzung auf dem Remoteserver benötigen, können Sie sshin einer Umgebung ohne ttyz. B. im Rahmen einer Aktion " Shell-Skript ausführen" in Automator ausführen .

Sie müssen ein Programm erstellen, das beim Aufruf das Kennwort standardmäßig ausgibt, z. B. das folgende Bash-Skript, das Sie ausführen müssen, um Folgendes auszuführen chmod +x pwd.sh:

#!/usr/bin/env bash
echo "password"

Setzen Sie dann die SSH_ASKPASSUmgebungsvariable auf den Pfad zu diesem Programm und führen Sie sshdie Automator-Aktion wie folgt aus :

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

Wenn nein tty, aber SSH_ASKPASSund DISPLAY(für X11 standardmäßig festgelegt) festgelegt sind, führt SSH das von angegebene Programm aus SSH_ASKPASSund verwendet seine Ausgabe als Kennwort. Dies soll in grafischen Umgebungen verwendet werden, damit ein Fenster angezeigt wird, in dem Sie nach Ihrem Kennwort gefragt werden. In diesem Fall haben wir einfach das Fenster übersprungen und das Passwort von unserem Programm zurückgegeben. Sie können securitystattdessen wie folgt aus Ihrem Schlüsselbund lesen:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

ls(in der sshBefehlszeile) ist der Befehl, der ausgeführt wird, wenn er sshangemeldet ist, und dessen Ausgabe in Automator gedruckt wird. Sie können es natürlich in eine Datei umleiten, um die Ausgabe des von Ihnen gestarteten Programms zu protokollieren.


Interaktive SSH-Sitzungen mit sshpass

Ich habe heruntergeladen, kompiliert und installiert sshpassund es hat perfekt funktioniert. Folgendes habe ich getan:

  1. Holen Sie sich die Apple-Entwicklertools
  2. Herunterladen und öffnen sshpass-1.05.tar.gz
  3. Öffnen Sie eine Shell für das Verzeichnis sshpass-1.05
  4. Lauf ./configure
  5. Lauf make
  6. Führen make installSie aus (möglicherweise benötigen sudoSie dafür)

Jetzt ist das Programm auf installiert /usr/local/bin/sshpass. Führen Sie mit einer Zeile wie der folgenden aus:

sshpass -pYourPassword ssh username@hostname

Sie können das Passwort securitykurz zuvor lesen und wie folgt verwenden:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

Wickeln Sie dies in eine Shell-Funktion ein und Sie können einfach zB ssh-yourhostnameeingeben, um eine Verbindung herzustellen, damit das Kennwort automatisch abgerufen und eingegeben wird.

Daniel Beck
quelle
Hallo, ich habe Ihre Antwort positiv bewertet, da sie mich zur Lösung geführt hat. Was Sie hier beschrieben haben, hat jedoch nicht genau funktioniert (dies ist möglicherweise spezifisch für Lion's Version von ssh). 1) Bei nicht interaktiven Sitzungen hat mich ssh immer noch nach einem Passwort gefragt, und nachdem ich es eingegeben habe, habe ich es erhalten STDIN is not a terminal. 2) Bei interaktiven Sitzungen mit macht sshpassdie -pOption anscheinend nichts. Aber laufen, sshpasswährend SSH_ASKPASSeingestellt ist, funktioniert!
Chaitanya Gupta
@ChaitanyaGupta Odd. Es funktionierte für mich nicht interaktiv innerhalb von Automator on Lion. In Bezug auf dieses zweite Problem ist es möglich, dass ich zu diesem Zeitpunkt eine Dirty-Shell-Sitzung hatte. Ich bin mir nicht mehr sicher. +1 an Sie und vielen Dank, dass Sie Ihre Lösung zur Website hinzugefügt haben.
Daniel Beck
Mein schlechtes (in Bezug auf 1) - Ich habe versucht, die nicht interaktive Sitzung im Terminal und nicht in Automator auszuführen. Ich habe es jetzt in Automator versucht und erhalte immer noch eine STDIN is not a terminalFehlermeldung. Diesmal wurde ich jedoch nicht zur Eingabe eines Passworts aufgefordert. Ich glaube, dass SSH_ASKPASSes im Automator funktioniert, da SSH_ASKPASSich eine Permission denied, please try again.Fehlermeldung bekomme , wenn ich die Datei mit dem falschen Passwort zurückschicke.
Chaitanya Gupta
1
Beachten Sie für die letzten Beispiele, dass unter Unix wie OS Befehlszeilenargumente und Umgebungsvariablen für andere Benutzer im System sichtbar sein können, sodass dies in einer sensiblen Mehrbenutzerumgebung nicht sicher ist.
Jürgen Strobel
@ DanielBeck jede Idee, wie dies funktioniertmacOs >= 10.13
nbari
7

Ich habe eine Lösung gefunden (danke an Daniel Beck für die Bereitstellung der dafür erforderlichen Schlüsselinformationen). Beachten Sie, dass ich dies nur mit OS X Lion 10.7.2 getestet habe. Wenn dies bei Ihnen nicht funktioniert, versuchen Sie es mit Daniels Lösung.

Zuerst müssen wir die SSH_ASKPASSUmgebungsvariable festlegen - ihr Wert sollte der Pfad zu einem Programm sein, das das Kennwort für die Standardausgabe druckt. Um das Passwort vom Schlüsselbund zu erhalten, muss es so aussehen (ich nenne es get-ssh-password.sh):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

Ein paar Punkte zu beachten:

  1. Dies setzt voraus, dass Sie das Passwort wie in der Frage beschrieben im Schlüsselbund gespeichert haben

  2. Das in angegebene Programm SSH_ASKPASSwird ohne Argumente aufgerufen. Daher verwenden wir Umgebungsvariablen, um den Benutzer und den Hostnamen an ihn zu übergeben.

Jetzt können wir festlegen SSH_PASSWORD_USERund SSH_PASSWORD_HOSTNAMEausführen sshpass, um uns bei unserem Server anzumelden.

Ich habe ein anderes Skript erstellt ssh-kcpass, um dies zu tun:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

Um sich beim SSH-Server anzumelden, ohne ein Kennwort einzugeben, müssen Sie nur ausführen ssh-kcpass user@hostname.

Chaitanya Gupta
quelle
Wie man das zum macOS >= 10.13
Laufen bringt
-3

Hallo Leute, ich bin auf dieses Thema gestoßen und habe nach etwas anderem gesucht, aber ... Ich weiß nicht, ob mir hier etwas fehlt ... aber Ihr Ansatz scheint mir seltsam. Warum nicht einfach die Authentifizierung mit öffentlichem Schlüssel verwenden? Generieren Sie einen RSA-Schlüssel. $ ssh-keygen -t rsa -b 2048 -C 'email / id'

Idealerweise verwenden Sie einmal die ssh-copy-id user @ host und authentifizieren sich einmal mit dem Kennwort, um den Schlüssel auf dem anderen Server zu installieren, oder verwenden ein beliebiges Skript oder Authentifizierungstool, um den Schlüssel für ~ / .ssh / autorisierte_keys auf bereitzustellen der andere Host (für den Benutzer, bei dem Sie sich anmelden möchten) Wenn Sie den Befehl manuell ausführen, müssen Sie / etc / ssh / sshd_config entsprechend bearbeiten und mit der Automatisierung (Chef, ansible) würden Sie die vollständige Bedingung für den gewünschten Status drücken.

Der Schlüssel, der für die Verteilung wichtig ist, ist id_rsa.pub. Bewahren Sie den privaten Schlüssel sicher auf

Um den Schlüsselbund zur automatischen Authentifizierung bei Hosts zu verwenden, bearbeiten Sie auf Ihrem Computer die Datei ~ / .ssh / config und fügen Sie Folgendes hinzu:

Host * UseKeychain ja

Suchen Sie nach weiteren Informationen zu den Optionen der SSH-Konfigurationsdatei und hoffen Sie, dass dies alles nützlich ist

Ricardo Mendes
quelle
1
Lesen Sie den ersten Satz des Fragenkörpers: '' Ich muss mich bei einem SSH-Server anmelden, der keine schlüsselbasierte Authentifizierung unterstützt. ''
Scott
Hallo Scott, ich denke, du hast auch den Teil verpasst, in dem er sagt, dass er das Passwort nicht jedes Mal eingeben möchte, was bedeutet, dass er es tut.
Ricardo Mendes
Nein, das habe ich nicht vermisst. Warum glaubst du, dass ich es getan habe?
Scott
Bc Sie sprechen immer noch
Ricardo Mendes