Wie übergebe ich das Passwort automatisch für den Befehl rsync SSH?


111

Ich tun muß rsyncdurch sshund will es ohne die Notwendigkeit , automatisch zu tun , der für Passwort vorbei sshmanuell.

Antworten:


44

Sie sollten eine Schlüsseldatei ohne Passphrase für ssh-Anmeldungen mit Skript verwenden. Dies ist offensichtlich ein Sicherheitsrisiko. Achten Sie darauf, dass die Schlüsseldatei selbst ausreichend gesichert ist.

Anweisungen zum Einrichten eines passwortlosen SSH-Zugriffs


9
Gibt es keine Möglichkeit, ein Passwort in einen Befehlstext einzufügen?
Liysd

3
Nicht einfach, es gibt keine Optionen dafür in ssh
Mad Scientist

Es sollte beachtet werden, dass dies nicht immer möglich ist (zB sind viele Android SSH Server Implementierungen ziemlich begrenzt).
Ponkadoodle

@Ponkadoodle Im OP geht es um clientseitige Anforderungen, nicht um serverseitige. ssh -isollte auf der Client-Seite immer möglich sein. Meinen Sie damit, dass der Server möglicherweise nicht alle Schlüsseltypen unterstützt (z. B. ECDSA)? Das wäre jedoch kein großes Problem, nur ein Fall der Verwendung ssh-keygen -t. Vermisse ich etwas
Jonathan H

1
Obwohl dies auf den ersten Blick problematisch zu sein scheint, ist dies die richtige Antwort. Passwörter sind vertrauliche Informationen, die nicht klar gespeichert oder in Programmen unachtsam verwendet werden sollten. Dafür sind Schlüsseldateien da; Erfahren Sie einfach mehr über Identitätsdateien rsync -eundssh -i .
Jonathan H

94

Verwenden Sie das nicht interaktive Dienstprogramm "sshpass" für den ssh-Passwortanbieter

Auf Ubuntu

 sudo apt-get install sshpass

Befehl zum rsync

 /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path  dest_path

4
Ich weiß, dass dies keine bewährte Methode ist, aber ich habe ein NAS mit einer verkrüppelten SSHD, die keine schlüsselbasierte Authentifizierung ausführt. Diese Antwort war das fehlende Teil meines automatisierten Backup-Puzzles. Also +1 für die letzte Antwort
Mike Gossmann

8
Wenn Sie eine Schlüsseldatei nicht verwenden können, das Kennwort jedoch nicht in den Befehl aufnehmen möchten, können Sie es in eine temporäre Datei schreiben und wie folgt einfügen : sshpass -p`cat .password` ssh [...]. Schützen Sie dann Ihre .passwordDatei, indem Sie chmod 400 .passwordsicherstellen, dass nur Ihr Benutzer sie lesen kann.
Lutuh

5
Der Vollständigkeit halber sollte im Fall von ssh'ing zu einem Remote-Server der src_pathServer: Pfad sein, wie server01.mydomain.local:/path/to/folder
folgt

Das ist definitiv die richtige Antwort! Sie können damit Skripte ohne SSH-Magie erstellen, indem Sie nur eine Skripterstellung durchführen. ;) Kudos @Rajendra
echtfafa

1
Da das -aEinschalten von rsync beinhaltet -rlptgoD, können Sie den Befehl wie rsync -az ...
folgt

24

Sie können die Kennwortabfrage auf rsyncBefehl vermeiden, indem Sie die Umgebungsvariable RSYNC_PASSWORDauf das Kennwort setzen, das Sie verwenden möchten, oder die --password-fileOption verwenden.


41
funktioniert nur, wenn auf dem Zielserver ein rsync-Daemon ausgeführt wird
Darryl Hebbes

4
Obwohl diese Antwort nur mit dem rsync-Daemon hilft, hat mich Google hier gelandet und es war genau das, was ich brauchte. Für mich brauchte ich direkt rsync zu rsyncd, kein ssh. Ich habe gerade die Option für die Passwortdatei verwendet und perfekt für ein Skript gearbeitet.
Gregthegeek

14

Wenn Sie keinen öffentlichen / privaten Schlüssel verwenden können, können Sie erwarten:

#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
    puts "rsync failed"
    exit 1
}
exit 0

Sie müssen SRC und DEST durch Ihre normalen rsync-Quell- und Zielparameter ersetzen und PASS durch Ihr Kennwort ersetzen. Stellen Sie einfach sicher, dass diese Datei sicher gespeichert ist!


3
Diese Befehle sind auf meinerRed Hat Enterprise Linux Server release 5.11 (Tikanga)
To Kra

13

Ich habe es so gemacht:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir

auf was würde das remote_port_ssheingestellt sein? Es sieht aus wie ein Platzhalter für einen tatsächlichen Wert.
Max Williams

6

Verwenden Sie einen SSH-Schlüssel.

Schau dir an ssh-keygenund ssh-copy-id.

Danach können Sie Folgendes verwenden rsync:

rsync -a --stats --progress --delete /home/path server:path

Wenn ich key mit ssh verwende, schreibe ich: ssh u @ serv -i ./rsa Aber wie geht das in rsync?
Liysd

2
Wenn Sie den Schlüssel in Ihr .ssh-Verzeichnis einfügen und ihm einen Standardnamen geben (normalerweise id_rsa / id_rsa.pub), wird er automatisch von rsync abgerufen.
Craig Trader

6

Eine weitere interessante Möglichkeit:

  1. RSA- oder DSA-Schlüsselpaar generieren (wie beschrieben)
  2. öffentlichen Schlüssel auf Host setzen (wie bereits beschrieben)
  3. Lauf:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" host_name @ host: / home / me / d.

Hinweis: -i dsa_private_file ist Ihr privater RSA / DSA-Schlüssel

Grundsätzlich ist dieser Ansatz dem von @Mad Scientist beschriebenen sehr ähnlich, Sie müssen jedoch Ihren privaten Schlüssel nicht nach ~ / .ssh kopieren. Mit anderen Worten, es ist nützlich für Ad-hoc-Aufgaben (einmaliger kennwortloser Zugriff)


5

Folgendes funktioniert für mich:

SSHPASS='myPassword'
/usr/bin/rsync -a -r -p -o -g --progress --modify-window=1 --exclude /folderOne -s -u --rsh="/usr/bin/sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -l root"  source-path  myDomain:dest-path  >&2

Ich musste installieren sshpass


2
-a impliziert bereits -rlptgoD und im Allgemeinen wäre es viel hilfreicher, hier eine reduzierte Befehlszeile zu haben.
Christian

4

Die automatische Eingabe des Kennworts für den Befehl rsync ist schwierig. Meine einfache Lösung, um das Problem zu vermeiden, besteht darin, den zu sichernden Ordner bereitzustellen. Verwenden Sie dann einen lokalen Befehl rsync, um den bereitgestellten Ordner zu sichern.

mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp

3

Obwohl Sie es bereits implementiert haben,

Sie können auch jede erwartete Implementierung verwenden (in Perl, Python finden Sie Alternativen: pexpect, paramiko usw.)


2

Ich verwende dazu eine VBScript-Datei auf der Windows-Plattform, die mich sehr gut bedient.

set shell = CreateObject("WScript.Shell")
shell.run"rsync -a Name@192.168.1.100:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"

2

Die offizielle Lösung (und andere) waren bei meinem ersten Besuch unvollständig, und so kam ich Jahre später zurück, um diesen alternativen Ansatz zu veröffentlichen, falls andere hier landen und beabsichtigen, ein öffentliches / privates Schlüsselpaar zu verwenden:

Führen Sie dies von der Zielsicherungsmaschine aus, die von der Quell- zur Zielsicherung wechselt

rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/

Führen Sie dies vom Quellcomputer aus, der von der Quell- zur Zielsicherung sendet

rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/

Wenn Sie keinen alternativen Port für ssh verwenden, sollten Sie die folgenden eleganteren Beispiele berücksichtigen:

Führen Sie dies von der Zielsicherungsmaschine aus, die von der Quell- zur Zielsicherung wechselt:

sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/

Führen Sie dies vom Quellcomputer aus, der von der Quell- zur Zielsicherung sendet:

sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/

Wenn Sie weiterhin zur Eingabe eines Kennworts aufgefordert werden, müssen Sie Ihre SSH-Konfiguration einchecken /etc/ssh/sshd_configund sicherstellen, dass die Benutzer in Quelle und Ziel jeweils über den jeweiligen öffentlichen SSH-Schlüssel der anderen Benutzer verfügen, indem Sie diese mit sendenssh-copy-id user@10.9.9.3 .

(Auch dies dient zur Verwendung von SSH-Schlüsselpaaren ohne Kennwort als alternativen Ansatz und nicht zur Weitergabe des Kennworts über eine Datei.)


Eine wichtige Randnotiz ist, dass Sie im Beispiel für einen alternativen Port ssh an Ihre private Schlüsseldatei weiterleiten. Wenn der Befehl auf dem Ziel ausgeführt wird, wird er sich anhand seines öffentlichen Schlüssels authentifizieren.
oemb1905

-1

Nach der Idee von Andrew Seaford erfolgt dies mit sshfs:

echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp
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.