¿Cómo pasar la contraseña automáticamente para el comando rsync SSH?

111

Necesito hacer rsyncpor sshy quiero hacerlo automáticamente sin la necesidad de pasar la contraseña de sshforma manual.

liysd
fuente

Respuestas:

44

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.

Instrucciones para configurar el acceso ssh sin contraseña

Científico loco
fuente
9
¿No hay posibilidad de poner contraseña en un texto de comando?
liysd
3
No es fácil, no hay opciones para ello en ssh
Mad Scientist
Cabe señalar que esto no siempre es posible (por ejemplo, muchas implementaciones de servidor ssh de Android son bastante limitadas).
Ponkadoodle
@Ponkadoodle El OP se trata de solicitudes del lado del cliente, no del lado del servidor. ssh -isiempre 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?
Jonathan H
1
Aunque esto pueda parecer complicado al principio, esta es la respuesta correcta. Las contraseñas son información confidencial y no deben almacenarse de forma clara ni usarse de manera descuidada en los programas. Para eso son los archivos de claves; solo obtenga más información sobre los archivos de identidad rsync -eyssh -i .
Jonathan H
94

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
Rajendra
fuente
4
Sé que esta no es la mejor práctica, pero tengo un NAS con un SSHD dañado que no realiza autenticación basada en claves. Esta respuesta era la pieza que faltaba en mi rompecabezas de respaldo automático. Entonces +1 para la respuesta de último recurso
Mike Gossmann
8
Si no puede utilizar un archivo de claves, pero no desea incluir la contraseña en el comando, se puede escribir en un archivo temporal e incluirlo como esto: sshpass -p`cat .password` ssh [...]. Luego, proteja su .passwordarchivo chmod 400 .passwordpara asegurarse de que solo su usuario pueda leerlo.
lutuh
5
Para completar, en el caso de ssh'ing a un servidor remoto, src_pathdebería ser server: path, así:server01.mydomain.local:/path/to/folder
harperville
esta es definitivamente la respuesta correcta! le permite hacer scripts sin la magia ssh, solo scripting uno. ;) Felicitaciones @Rajendra
genuinefafa
1
dado que -aencienda rsync incluye -rlptgoD, puede acortar el comando de esta manera:rsync -az ...
Jannie Theunissen
24

Puede evitar la solicitud de contraseña en el rsynccomando estableciendo la variable de entorno RSYNC_PASSWORDen la contraseña que desea usar o usando la --password-fileopción.

Diestro
fuente
41
solo funciona si el servidor de destino tiene el demonio rsync en ejecución
Darryl Hebbes
4
Aunque esta respuesta no ayuda a menos que use el demonio rsync, Google me trajo aquí y era exactamente lo que necesitaba. Para mí, necesitaba rsync directo a rsyncd, no ssh. Solo usé la opción de archivo de contraseña y funcionó perfectamente para un script.
gregthegeek
14

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!

Kainjow
fuente
3
esos comandos no están disponibles en miRed Hat Enterprise Linux Server release 5.11 (Tikanga)
A Kra
13

Lo hice funcionar así:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir
andrey465
fuente
¿En qué se remote_port_sshestablecería? Parece un marcador de posición para un valor real.
Max Williams
6

Utilice una clave ssh.

Mira ssh-keygeny ssh-copy-id.

Después de eso, puede usar de rsyncesta manera:

rsync -a --stats --progress --delete /home/path server:path
Guillaume Lebourgeois
fuente
Si uso la clave con ssh escribo: ssh u @ serv -i ./rsa Pero, ¿cómo hacerlo en rsync?
liysd
2
Si coloca la clave en su directorio .ssh y le da un nombre estándar (normalmente id_rsa / id_rsa.pub), rsync la recogerá automáticamente.
Craig Trader
6

Otra posibilidad interesante:

  1. generar un par de claves RSA o DSA (como se describió)
  2. poner la clave pública al host (como ya se describió)
  3. correr:
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)

xhudik
fuente
5

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

mario
fuente
2
-a ya implica -rlptgoD y, en general, sería mucho más útil tener una línea de comando reducida aquí.
Christian
4

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
Andrew Seaford
fuente
3

Aunque ya lo ha implementado,

también puede usar cualquier implementación de espera (encontrará alternativas en Perl, Python: pexpect, paramiko, etc.)

Joao Figueiredo
fuente
2

Utilizo un archivo VBScript para hacer esto en la plataforma Windows, me sirve muy bien.

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}"
joseph.smeng
fuente
2

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' [email protected]:/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/ [email protected]:/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 [email protected]:/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/ [email protected]:/var/www/

Si aún se le solicita una contraseña, debe verificar su configuración de ssh /etc/ssh/sshd_configy 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 [email protected].

(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).

oemb1905
fuente
Y una nota al margen importante es que en el ejemplo del puerto alternativo, está dirigiendo ssh a su archivo de clave privada, y cuando ejecuta el comando en el destino, se autenticará con su clave pública.
oemb1905
-1

Siguiendo la idea publicada por Andrew Seaford, esto se hace 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
lepe
fuente