it-swarm.com.de

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

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

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

Ich habe eine ähnliche Frage zum Stapelüberlauf gefunden, Kennwort für sftp in einem Bash-Skript angeben, aber es gab keine zufriedenstellende Antwort auf meine Frage Problem.

160
anubhava

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

  1. Verwenden Sie Schlüsselbund
  2. Verwenden Sie sshpass (weniger gesichert, aber wahrscheinlich entspricht das Ihrer Anforderung)
  3. Verwenden Sie erwarten (am wenigsten gesichert und mehr Codierung erforderlich)

Wenn Sie sshpass eine Chance geben möchten, finden Sie hier einen funktionierenden Skriptausschnitt:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - [email protected] << !
   cd incoming
   put your-log-file.log
   bye
!
164
anubhava

Ein anderer Weg wäre, lftp zu benutzen:

lftp sftp://user:[email protected]  -e "put local-file.name; bye"

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

Eine sicherere Alternative, die seit LFTP 4.5.0 verfügbar ist, ist das Setzen der Umgebungsvariablen LFTP_PASSWORD und das Ausführen von lftp mit --env-password. Hier ist ein vollständiges Beispiel:

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://[email protected]  -e "put local-file.name; bye"

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

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
88
Karassik

Expect ist ein großartiges Programm.

Unter Ubuntu installieren Sie es mit:

Sudo apt-get install expect

Auf einem CentOS-Computer installieren Sie es mit:

yum install expect

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

#!/usr/bin/expect

spawn sftp [email protected]
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

Dadurch wird eine SFTP-Verbindung mit Ihrem Kennwort zum Server hergestellt.

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 Remote-Server hochgeladen

46
rezizter

Sie können lftp interaktiv in einem Shell-Skript verwenden, damit das Kennwort nicht in .bash_history oder ähnlichem gespeichert wird, indem Sie folgendermaßen vorgehen:

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

Schreiben/beenden Sie den vi-Editor, nachdem Sie Host, Benutzer, Übergabe und Verzeichnis für Ihre Put-Datei bearbeitet haben, indem Sie :wq eingeben. Machen Sie dann Ihr Skript ausführbar chmod +x test_script.sh und führen Sie es ./test_script.sh aus.

21
Mike S.

Sie können dies überschreiben, indem Sie die Authentifizierung ohne Kennwort aktivieren. Sie sollten jedoch vorher die Schlüssel (pub, priv) installieren.

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

Local $> ssh-keygen -t rsa 

Drücken Sie die EINGABETASTE für alle Optionen, die dazu aufgefordert werden. Es müssen keine Werte eingegeben werden.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub [email protected]:
Prompts for pwd$>  ENTERPASSWORD

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

Local $> ssh [email protected]
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 kennwortlose Authentifizierung zu testen. Es sollte ohne Passwort verbunden sein.

$> ssh [email protected]
17
SriniV

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 der Option --password, um das Kennwort in der Befehlszeile zu übergeben.

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

Batch-Beispiel:

(
  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 auf verschiedenen Websites gesucht habe, bevor ich den Hilfebefehl (sftp -h) ausgeführt habe, und war überrascht, die Kennwortoption zu sehen.

16
Mahony

Kombinieren Sie sshpass mit einer gesperrten Anmeldeinformationsdatei und in der Praxis ist es so sicher wie nichts anderes - wenn Sie root auf der Box haben, um die Anmeldeinformationsdatei zu lesen, sind alle Wetten trotzdem deaktiviert.

7
Rich Harding

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

  1. Installiere sshpass für Ubuntu - Sudo apt-get install sshpass
  2. Füge die Remote-IP zu deiner bekannten Host-Datei hinzu, wenn es das erste Mal ist. Für Ubuntu -> ssh user @ IP -> gib 'yes' ein
  3. geben Sie dafür einen kombinierten Befehl aus scp und sshpass. Unten ist ein Beispielcode für die Kriegsbewältigung auf Remote-Tomcat sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #[email protected]#RemoteIP:/var/lib/Tomcat7/webapps
5
ravi ranjan

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

#!/bin/bash
expect -c "
spawn sftp [email protected]_Host
expect \"Password\"
send \"your_password_here\r\"
interact "

Möglicherweise müssen Sie erwarten, installieren, ändern Sie den Wortlaut von "Kennwort" in Kleinbuchstaben "p", um mit dem übereinzustimmen, was Ihre Eingabeaufforderung empfängt. 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.

5
Eric Leschinski