Wie benutze ich sshpass?


28

Ich muss verwenden sshpass, um einen Remote-Befehl über SSH von einem Java-Code aus zu starten.

Wenn ich eine Konsole manuell eingebe:

ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'

funktioniert einwandfrei, fragt aber nach Passwort. Also habe ich versucht zu rennen sshpass:

sshpass -p mypass ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -l user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -t user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh user@ipaddress echo 'OK'

und keiner von ihnen funktioniert.

Antworten:


28

Dies kann durch die Host-Key-Prüfungen von verursacht werden ssh. Es sieht so aus, als würde sshpassauf ungültigen Host-Schlüsseln geschwiegen (keine Ausgabe auf weder stderrnoch stdout) und es existiert mit Statuscode 6. Zum Zeitpunkt des Schreibens war dies die Revision 50, und die Übereinstimmungskonstante im Code RETURN_HOST_KEY_UNKNOWNweist auf diesen Fehler hin.

Ihr Fehlercode kann abweichen und ein Blick auf den oben verlinkten Code kann Ihnen einen Einblick geben.

Wenn es sich bei Ihrem Problem um einen ungültigen Hostschlüssel handelt, sollten Sie zweimal überlegen, ob Sie den Fehler mit einer CLI-Option überschreiben möchten. Ihr Computer könnte kompromittiert sein oder Sie könnten einem MITM-Angriff ausgesetzt sein! Wenn Sie sich zu 100% sicher sind, dass dies nicht der Fall ist, und Sie keine Möglichkeit haben, die überprüften Host-Schlüssel auf dem neuesten Stand zu halten, können Sie einen Befehl wie den folgenden verwenden:

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run

2
Bei der Brauinstallation wird nach -p ein Leerzeichen benötigt. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

HINWEIS: Jeder sollte bedenken, dass es sicherer ist, wenn immer möglich, passwortlose SSH-Host-Schlüssel zu verwenden! Per Definition ist die Verwendung von SSHPass weniger sicher.
Questionmark

@Questionmark Während dies zutrifft, gibt es Randfälle, in denen der Remote-Endpunkt die Authentifizierung über Schlüssel nicht unterstützt. Hier kommt sshpass ins Spiel
exhuma

Ja, ich weiß. Deshalb habe ich "wann immer möglich" gesagt ...
Questionmark

1
Mit genug neuem SSH gibt es StrictHostKeyChecking=accept-new.
muru

5

sshpassFunktioniert nur, wenn die Passwortabfrage auf endet assword:.

Wenn Ihre Passwortabfrage anders ist, müssen Sie möglicherweise den Quellcode von anpassen, um Ihre Eingabeaufforderung sshpasszu erkennen.

Ich habe Passwortabfragen wie Password for user@host:auf einigen Systemen gesehen, vielleicht ist dies Ihr Problem.


1
Es tut uns leid? -P prompt Which string should sshpass search for to detect a password prompt
m3nda

2
Diese neue Option (benötigt mindestens V1.0.6 von sshpass) löst dieses Problem.
rjs

Oh, Entschuldigung. Diese Art von Problem (Lösung?) Kommt so oft vor, dass alte Fragen bereits in neuen Versionen behoben sind. Vielen Dank.
m3nda

2

Ich denke du willst so etwas wie:

sshpass -p yourpassword ssh user@ipaddress somecommand

Zum Beispiel funktioniert das für mich:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

Haben Sie ein passwortloses Login eingerichtet?

Anmeldungen ohne Passwort mit OpenSSH http://www.debian-administration.org/articles/152


Ich bleibe lieber bei sshpass, da es unpraktisch ist, die passwortlose Anmeldung in einem Unternehmen zu
aktivieren

Haben Sie folgendes versucht: sshpass -p 'mypass' ssh username@server.example.com
koni_raid

Das habe ich getan, egal ob ich "mypass" oder "mypass" benutze. Es beginnt ewig zu warten
Roman Rdgz

sshpass -V funktioniert?
koni_raid

Es wird gedruckt: "Dieses Programm ist freie Software und kann unter den Bedingungen der GPL verteilt werden. Weitere Informationen finden Sie in der COPYING-Datei." Dann wird die Ausführung beendet und es werden keine weiteren Aktionen ausgeführt (ich habe versucht, -V an den Anfang des von mir bearbeiteten Befehls zu setzen und nicht nur sshpass -V einzugeben)
Roman Rdgz,

1

Dafür gibt es viele Möglichkeiten. Hier ist mein Lösungsvorschlag:

Zunächst einmal Ihr Passwort Speicherung in einer Variablen Sie flexibler Befehle geben. sshpasshat eine Option dafür:

-e: Mit dieser Option kann das Kennwort aus der $SSHPASSUmgebungsvariablen gelesen werden

Sie haben zwei Möglichkeiten, diese Variable festzulegen:

  1. Setze direkt in deinen Code:

    export SSHPASS='your_pass'
    
  2. Oder fragen Sie danach:

    readPassword () {
      echo Ssh Password: 
      read -s SSHPASS
      eval "export SSHPASS='""$SSHPASS""'"
    }
    
    # read password
    
    readPassword
    

Dann führe deinen Befehl aus.

  1. Wenn Ihr Befehl statisch ist, führen Sie ihn direkt aus:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Wenn Ihr Befehl dynamisch sein wird, verwenden Sie wie folgt:

    DYN_FILE_LOC='/media/data/myFavouriteSong.mp3'
    
    eval 'sshpass -e ssh user@host << EOF
    mplayer "$DYN_FILE_LOC"
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF'
    

hoffe das hilft jemandem.


Können Sie in Ihrer readPassword-Funktion nicht einfach SSHPASS exportieren?
Kutschkem

@kutschkem, ich vertraue aber meiner Idee, dass ich hier denke; Ich möchte meinen Pass nicht in eine statische Datei schreiben, sondern statt immer wieder ein Passwort für viele Server (7+) zu schreiben, schreibe ich einmal :) Sie müssen die readPasswordFunktion nicht verwenden , Sie können einfach Ihr Passwort schreiben, es sollte funktionieren :) Nur ich möchte meinen Code freigeben, der ein Beispiel sshpassfür dynamische Befehle zeigt: D
veysiertekin

Nein, ich meine nur, dass die Auswertung nach dem Lesen nicht notwendig ist, der Export benötigt keine Zuordnung. ss64.com/bash/export.html
kutschkem

Das Problem mit -e ist, dass der Export in Ihrem Verlauf aufgeführt wird
ejaenv

0

sshpassverwendet Pseudo-Terminals und die manSeite enthält Entschuldigungen für gelegentliche Unterbrechungen. Sie können es auch versuchen fd0ssh. Dies funktioniert, wenn Sie nicht stdinan einen Prozess auf dem Remotecomputer senden müssen . Das funktioniert, wenn Sie nur einen Befehl eingeben und das Ergebnis erfassen.


0

Die sshpass-Syntax lautet

sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments

Beachten Sie, dass zwischen -p und dem Kennwort kein Leerzeichen steht.

Außerdem ist mir aufgefallen, dass Sie mindestens einmal manuell eine Verbindung mit ssh herstellen müssen, um den RSA-Schlüssel der Maschine zu erhalten, zu der Sie eine Verbindung herstellen, um in die zu gelangen ~/.ssh/known_hosts bevor Sie mit sshpass eine Verbindung herstellen können.

Nachdem ich den Eintrag in der Datei known_hosts erhalten habe, kann ich einen Befehl wie z

sshpass -ffilename_with_password_in_it ssh user@server uname -a

und es wird den Befehl uname -aauf dem Remote-Server ausführen und die Ergebnisse auf dem lokalen Computer an den Standard ausgeben.


0

Was Sie brauchen, ist -f -t -t -t

sshpass -p$PASS ssh -f -t -t -t $USER@$HOST $COMMAND

Außerdem müssen Sie möglicherweise "requiretty" aus der Sudo-Konfiguration (/ etc / sudoers) auf dem Remotecomputer entfernen.


0
  1. einen Schlüssel machen

    ssh-keygen -t rsa

  2. Erstellen Sie einen .ssh-Ordner auf dem Remote-Server, in dem Sie nach einem Kennwort gefragt werden

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. Kopieren Sie den Schlüssel auf den Remote-Server

    cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'


Überprüfen Sie, ob ein Passwort abgefragt wird, falls dies nicht funktionieren sollte.

ssh $USER@SEVERNAME 'command'

0

@exhuma hatte ein Beispiel, das dazu führte, dass es für mich funktionierte.

Das Passwort muss in Form von -pPassword(ohne Leerzeichen) vorliegen

auch Anführungszeichen können notwendig sein: sshpass -p'Password&0' user@hostname

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.