Risposte:
È 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.
ssh -i
dovrebbe 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?
rsync -e
essh -i
.
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
sshpass -p`cat .password` ssh [...]
. Quindi proteggi il tuo .password
file chmod 400 .password
per assicurarti che solo il tuo utente possa leggerlo.
src_path
dovrebbe essere server: path, in questo modo:server01.mydomain.local:/path/to/folder
-a
accensione rsync include -rlptgoD
, puoi abbreviare il comando in questo modo:rsync -az ...
È possibile evitare la richiesta della password al rsync
comando impostando la variabile di ambiente RSYNC_PASSWORD
sulla password che si desidera utilizzare o utilizzando l' --password-file
opzione.
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!
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
Devo farlo funzionare in questo modo:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
remote_port_ssh
impostato? Sembra un segnaposto per un valore effettivo.
Usa una chiave SSH.
Guarda ssh-keygen
e ssh-copy-id
.
Dopodiché puoi usare un in rsync
questo modo:
rsync -a --stats --progress --delete /home/path server:path
Un'altra interessante possibilità:
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)
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
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
Anche se ormai l'hai già implementato,
è anche possibile utilizzare qualsiasi si aspettano da implementazione (troverete alternative in Perl, Python: pexpect, paramiko, ecc ..)
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}"
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_config
e 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.)
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