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.
quelle
StrictHostKeyChecking=accept-new
.sshpass
Funktioniert nur, wenn die Passwortabfrage auf endetassword:
.Wenn Ihre Passwortabfrage anders ist, müssen Sie möglicherweise den Quellcode von anpassen, um Ihre Eingabeaufforderung
sshpass
zu erkennen.Ich habe Passwortabfragen wie
Password for user@host:
auf einigen Systemen gesehen, vielleicht ist dies Ihr Problem.quelle
-P prompt Which string should sshpass search for to detect a password prompt
Ich denke du willst so etwas wie:
Zum Beispiel funktioniert das für mich:
quelle
Haben Sie ein passwortloses Login eingerichtet?
Anmeldungen ohne Passwort mit OpenSSH http://www.debian-administration.org/articles/152
quelle
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.
sshpass
hat eine Option dafür:-e
: Mit dieser Option kann das Kennwort aus der$SSHPASS
Umgebungsvariablen gelesen werdenSie haben zwei Möglichkeiten, diese Variable festzulegen:
Setze direkt in deinen Code:
Oder fragen Sie danach:
Dann führe deinen Befehl aus.
Wenn Ihr Befehl statisch ist, führen Sie ihn direkt aus:
Wenn Ihr Befehl dynamisch sein wird, verwenden Sie wie folgt:
hoffe das hilft jemandem.
quelle
readPassword
Funktion nicht verwenden , Sie können einfach Ihr Passwort schreiben, es sollte funktionieren :) Nur ich möchte meinen Code freigeben, der ein Beispielsshpass
für dynamische Befehle zeigt: Dsshpass
verwendet Pseudo-Terminals und dieman
Seite enthält Entschuldigungen für gelegentliche Unterbrechungen. Sie können es auch versuchenfd0ssh
. Dies funktioniert, wenn Sie nichtstdin
an einen Prozess auf dem Remotecomputer senden müssen . Das funktioniert, wenn Sie nur einen Befehl eingeben und das Ergebnis erfassen.quelle
Die sshpass-Syntax lautet
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
und es wird den Befehl
uname -a
auf dem Remote-Server ausführen und die Ergebnisse auf dem lokalen Computer an den Standard ausgeben.quelle
Was Sie brauchen, ist
-f -t -t -t
Außerdem müssen Sie möglicherweise "requiretty" aus der Sudo-Konfiguration (/ etc / sudoers) auf dem Remotecomputer entfernen.
quelle
einen Schlüssel machen
ssh-keygen -t rsa
Erstellen Sie einen .ssh-Ordner auf dem Remote-Server, in dem Sie nach einem Kennwort gefragt werden
ssh $USER@SEVERNAME mkdir -p .ssh
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.
quelle
@exhuma hatte ein Beispiel, das dazu führte, dass es für mich funktionierte.
Das Passwort muss in Form von
-pPassword
(ohne Leerzeichen) vorliegenauch Anführungszeichen können notwendig sein:
sshpass -p'Password&0' user@hostname
quelle