Wie führe ich den Befehl sftp mit einem Passwort aus dem Bash-Skript aus?

173

Ich muss eine Protokolldatei mit SFTP von einem Linux-Host auf einen Remote- Host übertragen. Ich habe von meiner Betriebsgruppe entsprechende Anmeldeinformationen erhalten. Da ich jedoch keine Kontrolle über einen anderen Host habe, kann ich keine RSA-Schlüssel generieren und für den anderen Host freigeben.

Gibt es also eine Möglichkeit, den sftpBefehl (mit dem angegebenen Benutzernamen / Passwort) über einen Cron- Job im Bash-Skript auszuführen ?

Ich habe eine ähnliche Frage zum Stapelüberlauf gefunden: Geben Sie das Kennwort für sftp in einem Bash-Skript an , aber es gab keine zufriedenstellende Antwort auf mein Problem.

Anubhava
quelle

Antworten:

178

Sie haben einige andere Optionen als die Verwendung der Authentifizierung mit öffentlichem Schlüssel:

  1. Verwenden Sie einen Schlüsselbund
  2. Verwenden Sie sshpass (weniger gesichert, aber wahrscheinlich entspricht dies Ihren Anforderungen)
  3. Verwenden Sie erwarten (am wenigsten gesichert und mehr Codierung erforderlich)

Wenn Sie sshpass eine Chance geben möchten, finden Sie hier ein funktionierendes Skript-Snippet, um dies zu tun:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!
Anubhava
quelle
3
Für die Verwendung auf dem Mac: stackoverflow.com/questions/9102557/…
anubhava
18
Keine Notwendigkeit zu exportieren, denke ich. SSHPASS=password sshpass -e ...sollte tun.
Jens
9
Ich konnte einen Einzeiler erstellen, um eine Protokolldatei herunterzuladen:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
Cloud Artisans
6
@gorus: Einzeiler ist sehr cool, aber ich wollte kein Passwort in der Kommandozeile verwenden, da das Risiko für Snooping erhöht ist.
Anubhava
8
-oBatchMode=nowar das entscheidende fehlende Stück für mich.
Richard kmiller
98

Ein anderer Weg wäre, lftp zu verwenden:

lftp sftp://user:password@host  -e "put local-file.name; bye"

Der Nachteil dieser Methode ist, dass andere Benutzer auf dem Computer das Kennwort von Tools wie lesen können psund dass das Kennwort Teil Ihres Shell-Verlaufs werden kann.

Eine sicherere Alternative, die seit LFTP 4.5.0 verfügbar ist, besteht darin, die LFTP_PASSWORDUmgebungsvariable festzulegen und lftp mit auszuführen --env-password. Hier ist ein vollständiges Beispiel:

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

LFTP enthält auch eine coole Spiegelungsfunktion (kann das Löschen nach bestätigter Übertragung beinhalten --Remove-source-files):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
Karassik
quelle
9
+1 für den Vorschlag einer Alternative, aber können wir vermeiden, ein Passwort in der Befehlszeile anzugeben?
Anubhava
1
Downvoted für die Anzeige des Passworts für alle auf dem gleichen Computer
Aaron Digulla
10
Sie können die Skriptdatei für lftp erstellen. Auf diese Weise müssen Sie das Kennwort nicht in der Befehlszeile angeben. Erstellen einer Datei put-script: open sftp://user:password@host; put local-file.name; exit Als Ausführen Auf lftp -f put-script diese Weise müssen Sie den Benutzernamen und das Kennwort nicht in einer Befehlszeile haben und können restriktive Berechtigungen für Ihre Skriptdatei einrichten.
Obaranovsky
@obaranovsky Das ist eine gute Idee. Ich frage mich, ob ich dies meiner Umgebungsvariablen als Alias ​​oder als Funktion hinzufügen würde. Wäre es sicher und möglich, es vor anderen Benutzern zu verbergen?
SDKKS
1
Weitaus einfacher lftpals mit sftpund herumzuspielen sshpass. Gute Antwort.
MeanEYE
53

Expect ist ein großartiges Programm.

Unter Ubuntu installieren Sie es mit:

sudo apt-get install expect

Installieren Sie es auf einem CentOS-Computer mit:

yum install expect

Nehmen wir an, Sie möchten eine Verbindung zu einem SFTP-Server herstellen und dann eine lokale Datei von Ihrem lokalen Computer auf den Remote-SFTP-Server hochladen

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

Dies öffnet eine SFTP-Verbindung mit Ihrem Passwort zum Server.

Dann geht es in das Verzeichnis, in das Sie Ihre Datei hochladen möchten, in diesem Fall "logdirectory".

Dadurch wird eine Protokolldatei aus dem lokalen Verzeichnis unter / var / log / mit dem Dateinamen file.log in das "Protokollverzeichnis" auf dem Remoteserver hochgeladen

Rezizter
quelle
Vielen Dank für Ihre Antwort, die ich als eine meiner Optionen zur Erreichung dieser Aufgabe erwartet hatte.
Anubhava
Danke dir. Ich habe Ihre Antwort durch eine Suche gefunden, sie verwendet und erfolgreich ein Skript mit Erwartung erstellt. Habe gerade das Drehbuch für Poterity
Rezizter
Vielen Dank für Ihre Antwort, ich habe es bereits positiv bewertet :)
Anubhava
Ich benutze dies, um die Passphrase für den privaten SSH-Schlüssel einzugeben. Es ist einfacher, auf allen Servern denselben öffentlichen Schlüssel zu platzieren und die Passphrase für den privaten Schlüssel regelmäßig zu drehen.
SDKKS
24

Sie können lftp interaktiv in einem Shell-Skript verwenden, damit das Kennwort nicht in .bash_history oder ähnlichem gespeichert wird. Gehen Sie dazu wie folgt vor:

vi test_script.sh

Fügen Sie Ihrer Datei Folgendes hinzu:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

Und schreiben / beenden Sie den vi-Editor, nachdem Sie den Host, den Benutzer, den Pass und das Verzeichnis für die Eingabe Ihrer Put-Datei :wqbearbeitet haben. Machen Sie dann Ihr Skript ausführbar chmod +x test_script.shund führen Sie es aus ./test_script.sh.

Mike S.
quelle
2
Um eine vorhandene Datei zu überschreiben, fügen Sie nach lftp << END_SCRIPT
Balaji Natarajan
17

Ich wurde kürzlich gebeten, von FTP auf SFTP umzuschalten, um die Dateiübertragung zwischen Servern zu sichern. Wir verwenden das Tectia SSH-Paket, mit dem Sie --passworddas Kennwort in der Befehlszeile übergeben können.

Beispiel: sftp --password="password" "userid"@"servername"

Chargenbeispiel:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

Ich dachte, ich sollte diese Informationen teilen, da ich mir verschiedene Websites angesehen habe, bevor ich den Hilfebefehl ( sftp -h) ausführte , und war überrascht, die Kennwortoption zu sehen.

Mahony
quelle
9
+1 für dich guter vorschlag. Dies erfordert jedoch, dass Sie das Kennwort in der Befehlszeile übergeben, und jeder im System, der den psBefehl ausführt, kann Ihr Kennwort sehen.
Anubhava
4
Ich habe das versucht, ich habeunknown option -- - usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host sftp [user@]host[:file ...] sftp [user@]host[:dir[/]] sftp -b batchfile [user@]host
cyber8200
1
@ihue wahrscheinlich, weil Sie Techia SSH benötigen , nicht OpenSSH
qris
17

Sie können überschreiben, indem Sie die Authentifizierung ohne Kennwort aktivieren. Aber Sie sollten Schlüssel (pub, priv) installieren, bevor Sie sich dafür entscheiden.

Führen Sie die folgenden Befehle auf dem lokalen Server aus.

Local $> ssh-keygen -t rsa 

Drücken Sie die EINGABETASTE, um alle angeforderten Optionen anzuzeigen. Es müssen keine Werte eingegeben werden.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

Stellen Sie mit dem folgenden Befehl eine Verbindung zum Remote-Server her

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

Führen Sie die folgenden Befehle auf dem Remote-Server aus

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

Führen Sie den folgenden Befehl auf dem lokalen Server aus, um die Authentifizierung ohne Kennwort zu testen. Es sollte ohne Passwort verbunden sein.

$> ssh user@targetmachine
SriniV
quelle
1
+1 für Ihre Antwort, aber bei der Frage ging es darum, es ohne öffentliche / private Schlüssel zu tun.
Anubhava
oops ..
Habe
Wird dieser Befehl aus Neugier, lftp -p ${port} -u ${login_id},${password} ${ip_number}wenn er von einem Shell-Skript aufgerufen wird, irgendwo gedruckt? Wie haben Sie außer sshpass gelöst?
SriniV
Ich habe lftpund verlasse mich nicht auf sshpassMac und Linux.
Anubhava
Reines Gold. Vielen Dank! :)
Nikolay Tsenkov
7

Kombinieren Sie sshpass mit einer gesperrten Anmeldeinformationsdatei und in der Praxis ist es so sicher wie alles andere. Wenn Sie root auf der Box haben, um die Anmeldeinformationsdatei zu lesen, sind alle Wetten sowieso deaktiviert.

Rich Harding
quelle
5

Bash-Programm, um darauf zu warten, dass sftp nach einem Passwort fragt, und es dann mitzusenden:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

Möglicherweise müssen Sie erwartungsgemäß installieren und den Wortlaut von 'Passwort' in Kleinbuchstaben 'p' ändern, um dem zu entsprechen, was Ihre Eingabeaufforderung erhält. Das Problem hierbei ist, dass Ihr Kennwort sowohl in der Datei als auch im Befehlsverlauf im Klartext angezeigt wird. Was den Zweck, ein Passwort zu haben, fast zunichte macht.

Eric Leschinski
quelle
+1, aber ich denke, Sie geben klar an, was die Probleme mit diesem Ansatz sind.
Anubhava
5

Sie können sshpass dafür verwenden. Unten sind die Schritte

  1. Installieren Sie sshpass für Ubuntu - sudo apt-get install sshpass
  2. Fügen Sie die Remote-IP zu Ihrer bekannten Host-Datei hinzu, wenn es das erste Mal ist. Für Ubuntu -> ssh user @ IP -> geben Sie 'yes' ein.
  3. Geben Sie dafür einen kombinierten Befehl von scp und sshpass ein. Unten finden Sie einen Beispielcode für die Kriegsbewältigung mit Remote Tomcat sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
Ravi Ranjan
quelle