Stellen Sie eine Verbindung über SSH her und geben Sie das Kennwort automatisch ein, ohne einen öffentlichen Schlüssel zu verwenden

20

Ein Server lässt SSH-Verbindungen zu, verwendet jedoch keine Authentifizierung mit öffentlichem Schlüssel. Es liegt nicht in meiner Macht, dies im Moment zu ändern (aufgrund technischer Schwierigkeiten, nicht organisatorischer), aber ich werde es so schnell wie möglich tun!

Was ich jetzt brauche, ist die Ausführung von Befehlen auf dem Server unter Verwendung eines normalen alten Kontos + Kennwortauthentifizierung von einem Skript . Das heißt, ich muss es auf nicht interaktive Weise tun. Ist es möglich? Und wie mache ich das?

Der Client, der das Skript ausführt, führt Ubuntu Server 8.04 aus. Auf dem Server werden Cygwin und OpenSSH ausgeführt.

Gelöscht
quelle
2
Was sind die technischen Schwierigkeiten bei der Aktivierung der schlüsselbasierten Authentifizierung? Vielleicht sollten Sie diese Frage stattdessen oder zusätzlich zu dieser stellen.
Zoredache
1
Ich frage es. :-) serverfault.com/questions/125842/… Ich brauche vorerst nur einen Fluchtweg, da ich schon eine Weile mit dem Kopf gegen diesen knallte . Aber mein Ziel ist es natürlich, dass es langfristig funktioniert.
Gelöscht am

Antworten:

22

Es gibt ein Linux-Dienstprogramm namens sshpass. Sie können damit genau das tun, was Sie möchten, und ein Server-Passwort entweder als Befehlszeilenargument oder aus einer Datei übernehmen (ich bevorzuge dies, sodass mein Server-Passwort nicht im Shell-Verlauf angezeigt wird) und Sie verwenden es wie so:

sshpass -f file_with_password ssh user@server ls -la

Dies wird in einen Server ssh und ausgeführt ls -la. Eine Sache ist jedoch, dass Sie zuerst manuell auf einen Server ssh müssen (falls Sie dies noch nicht getan haben), damit der Server zu Ihrem Server hinzugefügt wird ~/.ssh/known_hosts. Wenn Sie das nicht tun, sshpasswird nicht funktionieren.

solefald
quelle
2
Dies ist kein Standard-Teil von OpenSSH, und buchstäblich keine meiner Maschinen (Mac OS X 10.7, Ubuntu 12.04, FreeBSD 8, Debian 3.1) haben es ...
voretaq7
@ voretaq7: sshpass ist ein SourceForge-Projekt: sourceforge.net/projects/sshpass
kevinarpe
1
@KCArpe Ich glaube, Sie haben meinen Standpunkt verfehlt ("Die ganze Welt ist nicht Ihr Linux-Rechner - versuchen Sie, Lösungen zu finden, die an anderen Orten funktionieren"). Die Verwendung der SSH_ASKPASSVariablen ist eine allgemeinere Lösung, die auf jedem OpenSSH-System funktioniert und keine Installation zusätzlicher Software erfordert. Für einige von uns (in regulierten Branchen) bedeutet die Installation neuer Software einen hohen Verwaltungsaufwand.
Voretaq7
@ voretaq7 Verwenden SSH_ASKPASSfunktioniert nicht auf allen Systemen. Selbst wenn der Client dies unterstützt, funktioniert es nicht, wenn der Server dies verwendet keyboard-interactive. Ich habe dieses Problem tatsächlich beim Schreiben eines Skripts zum Verteilen einer authorized_keysDatei auf eine Reihe eingebetteter Maschinen festgestellt .
Kasperd
8

Sie können Expect verwenden , um dies zu tun. Offensichtlich ist dies aus Sicherheitsgründen nicht zu bevorzugen, da Sie ein Skript verwenden müssen, das Ihr Kennwort im Klartext enthält. (Aber ich werde diesen Punkt nicht näher erläutern, da Sie in Ihrer Frage angegeben haben, dass Sie die Authentifizierung mit öffentlichen Schlüsseln so bald wie möglich verwenden möchten!)

Mox
quelle
Das scheint mein Problem zu lösen! Ich werde es morgen überprüfen. Es ist nicht die endgültige Lösung, bietet aber Sicherheit. Wenn ich darüber nachdenke, ob der Skriptbenutzer der einzige ist, der das Skript lesen darf. Dann ist es so sicher wie mein privater Schlüssel, der auch "nur" durch Dateisystemberechtigungen geschützt ist. Oder habe ich etwas verpasst?
Gelöscht am
Ich werde morgen mit Ergebnissen zurückkommen. :-) Danke für die Antwort!
Gelöscht am
Es scheint zu funktionieren. Aber sshpass war für diesen speziellen Fall meiner Meinung nach einfacher.
Gelöscht am
7

Hängt ein wenig von der verwendeten Skriptsprache ab. Ich schreibe jetzt fast alles in Python, wo dies kein Problem ist. Sowohl mit pyssh als auch mit Paramiko können Sie das Kennwort einfach und ohne großen Aufwand schreiben.

Wenn Sie beabsichtigen, dies mit (ba) sh-Skripten zu tun und OpenSSH zu verwenden, wird es schwieriger. OpenSSH verhindert explizit, dass Sie Kennwörter in die Befehlszeile eingeben (da alle Benutzer die Befehlszeile mit etwas sehen können ps -fe, was schlecht für mojo ist). In diesem Fall müssen Sie direkt mit dem ssh-Programm interagieren und haben zwei Möglichkeiten:

  • Sie können eine beträchtliche Menge an Support-Code schreiben, indem Sie so etwas wie Expect verwenden.
  • Sie führen einen Hack mit der Variablen SSH_ASKPASS durch, indem Sie eine Anwendung aufrufen, die Ihr Kennwort zurückgibt, und alles als Batch-Job ausführen, um zu verhindern, dass es vom Terminal gelesen wird.
pehrs
quelle