2010-07-21 5 views

risposta

34

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

Instructions for setting up passwordless ssh access

+5

Non ci sono possibilità di mettere la password in un testo di comando? – liysd

+1

Non facilmente, non ci sono opzioni per esso in ssh –

+0

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

4

utilizzare una chiave SSH:

sguardo ssh-keygen e ssh-copy-id.

Dopo di che è possibile utilizzare un rsync in questo modo:

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

Se uso la chiave con ssh, scrivo: ssh u @ serv -i ./rsa Ma come farlo in rsync? – liysd

+0

Se inserisci la chiave nella tua directory .ssh e le assegni un nome standard (in genere id_rsa/id_rsa.pub) verrà rilevata automaticamente da rsync. –

2

Anche se hai già implementato da ora,

è anche possibile usare qualsiasi expect implementazione (troverete alternative in Perl , Python: pexpect, paramiko, ecc.)

17

È possibile evitare la richiesta della password sul comando rsync impostando la variabile di ambiente RSYNC_PASSWORD sulla password che si desidera utilizzare o utilizzando l'opzione --password-file.

+28

funziona solo se il server di destinazione ha un daemon rsync in esecuzione –

+3

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

61

Usa "sshpass" utility provider di password di ssh non interattivo

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 
+1

So che non si tratta di best practice, ma ho un NAS con un SSHD storpio che non eseguirà l'autenticazione basata su chiave. Questa risposta è stata la parte mancante del mio puzzle di backup automatico. Quindi +1 per la risposta dell'ultimo resort –

+0

Non sapevo di sshpass, è stato utile in una situazione complicata. – haridsv

+5

Se non puoi usare un file di chiavi, ma non vuoi includere la password nel comando, puoi scriverlo in un file temporaneo e includerlo in questo modo: 'sshpass -p \' cat .password \ 'ssh [.. .] '. Quindi proteggi il tuo file '.password' da' chmod 400 .password' per assicurarti che solo il tuo utente possa leggerlo. – lutuh

4

un'altra possibilità interessante: 1. Generare RSA o DSA coppia di chiavi (come descritto) 2. inserisci la chiave pubblica per l'host (come già descritto) 3. Eseguire:

rsync --partial --progress --rsh="ssh -i dsa_private_file" [email protected]:/home/me/d . 

Nota: -i dsa_private_file che è il vostro RSA/DSA chiave privata

In sostanza, questo approccio è molto simile a quello descritto da @Mad Scientist, tuttavia si fa non devi copiare la tua chiave privata in ~/.ssh. In altre parole, è utile per le attività ad-hoc (un tempo di accesso senza password)

9

Se non è possibile utilizzare un chiavi pubbliche/private, è possibile utilizzare aspettare:

#!/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 sorgente e destinazione rsync e sostituire PASS con la password. Assicurati che questo file sia conservato in modo sicuro!

+2

questi comandi non sono disponibili sul mio 'Red Hat Enterprise Linux Server versione 5.11 (Tikanga)' –

0

L'immissione automatica della password per il comando rsync è difficile. La mia soluzione semplice 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 
-1

Seguendo l'idea pubblicato da Andrew Seaford, questo viene fatto usando sshfs:

echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected]:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin 
rsync -a /mnt/source-tmp/ /media/destination/ 
umount /mnt/source-tmp 
2

Io uso un file VBScript per fare questo su piattaforma Windows, i server mi ha fatto molto bene.

set shell = CreateObject("WScript.Shell") 
shell.run"rsync -a [email protected]:/Users/Name/Projects/test ." 
WScript.Sleep 100 
shell.SendKeys"Your_Password" 
shell.SendKeys "{ENTER}" 
1

i seguenti lavori 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

+0

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