Respuestas:
Debe utilizar un archivo de claves sin frase de contraseña para los inicios de sesión ssh con script. Obviamente, esto es un riesgo para la seguridad, asegúrese de que el archivo de claves esté adecuadamente protegido.
ssh -i
siempre debería ser posible en el lado del cliente. ¿Quiere decir que es posible que el servidor no admita todos los tipos de claves (por ejemplo, ECDSA)? Sin embargo, eso no sería un problema importante, solo un caso de uso ssh-keygen -t
. ¿Me estoy perdiendo de algo?
rsync -e
yssh -i
.
Utilice la utilidad de proveedor de contraseñas ssh no interactivo "sshpass"
En Ubuntu
sudo apt-get install sshpass
Comando para 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 [...]
. Luego, proteja su .password
archivo chmod 400 .password
para asegurarse de que solo su usuario pueda leerlo.
src_path
debería ser server: path, así:server01.mydomain.local:/path/to/folder
-a
encienda rsync incluye -rlptgoD
, puede acortar el comando de esta manera:rsync -az ...
Puede evitar la solicitud de contraseña en el rsync
comando estableciendo la variable de entorno RSYNC_PASSWORD
en la contraseña que desea usar o usando la --password-file
opción.
Si no puede usar claves públicas / privadas, puede usar esperar:
#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
puts "rsync failed"
exit 1
}
exit 0
Deberá reemplazar SRC y DEST con sus parámetros de origen y destino rsync normales, y reemplazar PASS con su contraseña. ¡Solo asegúrese de que este archivo esté almacenado de forma segura!
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
Lo hice funcionar así:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
remote_port_ssh
establecería? Parece un marcador de posición para un valor real.
Utilice una clave ssh.
Mira ssh-keygen
y ssh-copy-id
.
Después de eso, puede usar de rsync
esta manera:
rsync -a --stats --progress --delete /home/path server:path
Otra posibilidad interesante:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" nombre_host @ host: / home / me / d.
Nota: -i dsa_private_file, que es su clave privada RSA / DSA
Básicamente, este enfoque es muy similar al descrito por @Mad Scientist, sin embargo, no es necesario que copie su clave privada en ~ / .ssh. En otras palabras, es útil para tareas ad-hoc (acceso único sin contraseña)
Lo siguiente funciona para mí:
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
Tuve que instalar sshpass
Es difícil ingresar automáticamente la contraseña para el comando rsync. Mi solución simple para evitar el problema es montar la carpeta para respaldarla. Luego use un comando rsync local para hacer una copia de seguridad de la carpeta montada.
mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp
Aunque ya lo ha implementado,
también puede usar cualquier implementación de espera (encontrará alternativas en Perl, Python: pexpect, paramiko, etc.)
Utilizo un archivo VBScript para hacer esto en la plataforma Windows, me sirve muy bien.
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 solución oficial (y otras) estaban incompletas cuando la visité por primera vez, por lo que volví, años después, para publicar este enfoque alternativo en caso de que otros terminen aquí con la intención de usar un par de claves pública / privada:
Ejecute esto desde la máquina de copia de seguridad de destino, que se extrae de la copia de seguridad de origen a la de destino
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/
Ejecute esto desde la máquina de origen, que envía la copia de seguridad de origen a destino
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/
Y, si no está utilizando un puerto alternativo para ssh, considere los ejemplos más elegantes a continuación:
Ejecute esto desde la máquina de copia de seguridad de destino, que extrae de la copia de seguridad de origen a la de destino:
sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/
Ejecute esto desde la máquina de origen, que envía desde la copia de seguridad de origen a destino:
sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/
Si aún se le solicita una contraseña, debe verificar su configuración de ssh /etc/ssh/sshd_config
y verificar que los usuarios en el origen y el destino tengan cada uno la clave ssh pública respectiva de los demás enviando cada uno con ssh-copy-id user@10.9.9.3
.
(Nuevamente, esto es para usar pares de claves ssh sin contraseña, como un enfoque alternativo, y no para pasar la contraseña a través de un archivo).
Siguiendo la idea publicada por Andrew Seaford, esto se hace 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