Come passare automaticamente la password per il comando rsync SSH?


111

Ho bisogno di fare rsyncper sshe voglio farlo automaticamente senza la necessità di passare password sshmanualmente.

Risposte:


44

È necessario utilizzare un file di chiavi senza passphrase per gli accessi ssh con script. Questo è ovviamente un rischio per la sicurezza, assicurati che il keyfile stesso sia adeguatamente protetto.

Istruzioni per configurare l'accesso SSH senza password


9
Non è possibile inserire la password in un testo di comando?
liysd

3
Non facilmente, non ci sono opzioni per questo in ssh
Mad Scientist

Va notato che questo non è sempre possibile (ad esempio, molte implementazioni di server ssh Android sono piuttosto limitate).
Ponkadoodle

@Ponkadoodle L'OP riguarda le richieste lato client, non lato server. ssh -idovrebbe essere sempre possibile sul lato client. Intendi dire che il server potrebbe non supportare tutti i tipi di chiavi (ad es. ECDSA)? Tuttavia, non sarebbe un grosso problema, solo un caso di utilizzo ssh-keygen -t. Mi sto perdendo qualcosa?
Jonathan H

1
Anche se all'inizio potrebbe sembrare una seccatura, questa è la risposta corretta. Le password sono informazioni sensibili e non devono essere archiviate in modo chiaro o utilizzate con noncuranza nei programmi. A questo servono i file di chiavi; basta conoscere i file di identità rsync -eessh -i .
Jonathan H

94

Utilizzare l'utilità del provider di password ssh non interattiva "sshpass"

Su Ubuntu

 sudo apt-get install sshpass

Comando per rsync

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

4
So che questa non è la migliore pratica, ma ho un NAS con un SSHD paralizzato che non esegue l'autenticazione basata su chiave. Questa risposta era il pezzo mancante del mio puzzle di backup automatico. Quindi +1 per la risposta di ultima istanza
Mike Gossmann

8
Se non è possibile utilizzare un file di chiavi, ma non si vuole includere la password nel comando, è possibile scrivere in un file temporaneo e includerlo in questo modo: sshpass -p`cat .password` ssh [...]. Quindi proteggi il tuo .passwordfile chmod 400 .passwordper assicurarti che solo il tuo utente possa leggerlo.
Lutuh

5
Per completezza, nel caso di ssh'ing su un server remoto, src_pathdovrebbe essere server: path, in questo modo:server01.mydomain.local:/path/to/folder
harperville

questa è sicuramente la risposta giusta! ti permette di fare script senza ssh magic, ma solo di eseguirne uno. ;) Kudos @Rajendra
genuinefafa

1
poiché l' -aaccensione rsync include -rlptgoD, puoi abbreviare il comando in questo modo:rsync -az ...
Jannie Theunissen

24

È possibile evitare la richiesta della password al rsynccomando impostando la variabile di ambiente RSYNC_PASSWORDsulla password che si desidera utilizzare o utilizzando l' --password-fileopzione.


41
funziona solo se il server di destinazione ha il demone rsync in esecuzione
Darryl Hebbes

4
Anche se questa risposta non aiuta a meno che non si utilizzi il demone rsync, Google mi ha portato qui ed era esattamente ciò di cui avevo bisogno. Per me, avevo bisogno di rsync diretto a rsyncd, no ssh. Ho appena usato l'opzione file password e ho funzionato perfettamente per uno script.
gregthegeek

14

Se non puoi usare una chiave pubblica / privata, puoi usare aspettativa:

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

Sarà necessario sostituire SRC e DEST con i normali parametri di origine e destinazione di rsync e sostituire PASS con la password. Assicurati solo che questo file sia archiviato in modo sicuro!


3
quei comandi non sono disponibili sul mioRed Hat Enterprise Linux Server release 5.11 (Tikanga)
To Kra

13

Devo farlo funzionare in questo modo:

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

su cosa sarebbe remote_port_sshimpostato? Sembra un segnaposto per un valore effettivo.
Max Williams,

6

Usa una chiave SSH.

Guarda ssh-keygene ssh-copy-id.

Dopodiché puoi usare un in rsyncquesto modo:

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

Se utilizzo key con ssh scrivo: ssh u @ serv -i ./rsa Ma come si fa in rsync?
liysd

2
Se metti la chiave nella tua directory .ssh e le dai un nome standard (tipicamente id_rsa / id_rsa.pub) verrà automaticamente prelevata da rsync.
Craig Trader

6

Un'altra interessante possibilità:

  1. generare coppia di chiavi RSA o DSA (come è stato descritto)
  2. mettere la chiave pubblica per ospitare (come è stato già descritto)
  3. correre:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" nome_host @ host: / home / me / d.

Nota: -i dsa_private_file che è la tua chiave privata RSA / DSA

Fondamentalmente, questo approccio è molto simile a quello descritto da @Mad Scientist, tuttavia non devi copiare la tua chiave privata in ~ / .ssh. In altre parole, è utile per attività ad hoc (accesso una tantum senza password)


5

Il seguente funziona per me:

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

Ho dovuto installare sshpass


2
-a implica già -rlptgoD e in generale, sarebbe molto più utile avere una riga di comando ridotta qui.
Christian

4

L'immissione automatica della password per il comando rsync è difficile. La mia semplice soluzione per evitare il problema è montare la cartella di cui eseguire il backup. Quindi utilizzare un comando rsync locale per eseguire il backup della cartella montata.

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

Anche se ormai l'hai già implementato,

è anche possibile utilizzare qualsiasi si aspettano da implementazione (troverete alternative in Perl, Python: pexpect, paramiko, ecc ..)


2

Uso un file VBScript per farlo su piattaforma Windows, mi serve molto bene.

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

La soluzione ufficiale (e altre) erano incomplete quando ho visitato per la prima volta, quindi sono tornato, anni dopo, per pubblicare questo approccio alternativo nel caso in cui altri finissero qui con l'intenzione di utilizzare una coppia di chiavi pubblica / privata:

Eseguilo dalla macchina di backup di destinazione, che esegue il pull dall'origine al backup di destinazione

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

Eseguilo dalla macchina di origine, che invia dal backup di origine a quello di destinazione

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

E, se non stai usando una porta alternativa per ssh, considera gli esempi più eleganti di seguito:

Eseguilo dalla macchina di backup di destinazione, che esegue il pull dal backup di origine a quello di destinazione:

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

Eseguilo dalla macchina di origine, che invia dall'origine al backup di destinazione:

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

Se ti viene ancora chiesta una password, devi controllare la tua configurazione ssh /etc/ssh/sshd_confige verificare che gli utenti di origine e di destinazione abbiano ciascuno la rispettiva chiave ssh pubblica degli altri inviando ciascuno di essi con ssh-copy-id user@10.9.9.3.

(Di nuovo, questo serve per usare coppie di chiavi ssh senza password, come approccio alternativo, e non per passare la password tramite un file.)


E un'importante nota a margine è che nell'esempio di porta alternativa, stai indirizzando ssh al tuo file di chiave privata e quando esegue il comando sulla destinazione, si autenticherà sulla sua chiave pubblica.
oemb1905

-1

Seguendo l'idea pubblicata da Andrew Seaford, questo viene fatto usando 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.