Ejecute rsync con permiso de root en la máquina remota

32

Quiero sincronizar una carpeta de mi máquina con una carpeta en una máquina remota. La carpeta remota solo puede ser manipulada por root. Tengo una cuenta en la máquina remota que puedo usar sudo. ¿Cómo puedo ejecutar rsync de modo que tenga permisos de root en la máquina remota?

He intentado lo siguiente:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="sudo rsync"

Pero (después de ingresar mi contraseña) aparece el siguiente error:

sudo: no tty present and no askpass program specified
Peter
fuente
¿No puede cambiar los permisos en la carpeta remota para que su usuario tenga acceso de escritura?
Phil
1
Lamentablemente, esa no es una opción.
Peter
Es mucho mejor verificar la respuesta sobre la misma pregunta en Unix SE unix.stackexchange.com/questions/92123/… .
ndemou

Respuestas:

12

Prueba esta solución. En su archivo sudoers ( /etc/sudoers) configure a su usuario así:

username ALL= NOPASSWD:/usr/bin/rsync

el NOPASSWD:/usr/bin/rsyncle dice sudoque cuando su usuario se ejecuta /usr/bin/rsynco simplemente rsyncque no se necesita contraseña.

Entonces tu original --rsync-path="sudo rsync"debería funcionar.

dynabaul
fuente
Usé la opción sudo rsync sin configurar el nombre de usuario ALL ... después de que rsync haya terminado. en el control remoto cuando trato de cd o ls. Me deniegan el permiso. aunque soy root Tengo que sudo a ls. pero en el caso de cd ni siquiera es posible. Traté de cortar todos los directorios y archivos. Todavía no funcionó. Alguien sabe la razón y cómo solucionarlo?
Temido punto y coma
2
también debe decir cómo editar el archivo sudoers
Jonathan
2
Consulte unix.stackexchange.com/a/92397/128237 para conocer las implicaciones de seguridad de esta solución.
BrainStorm.exe
11

Esta es la solución que se me ocurrió:

rsync -R -avz -e ssh --rsync-path="echo mypassword | sudo -S  mkdir -p /remote/lovely/folder && sudo rsync" /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete

¡Un poco de misión!

Peter
fuente
12
Espero que reconozca su contraseña será visible en la línea de comando. Debería estar visible durante el tiempo que se ejecuta rsync.
BillThor
1
¿Dónde está visible la contraseña? ¿Solo en el cuadro local en la línea de comando? ¿O este enfoque también crea vulnerabilidades remotas? Estoy tratando de entender la respuesta anterior y las ramificaciones del uso de esta solución. Hice una pregunta aquí: superuser.com/questions/398146/…
MountainX
@MountainX Será visible en la lista de procesos (por ejemplo ps aux). Prueba:, rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/exampleluego abra la terminal en la máquina remota y ps aux | grep find. find /se usa solo porque es lo primero que se me ocurrió con una gran duración de ejecución.
Ivan Vučica
1
Sé que esto es antiguo pero, si desea evitar la contraseña en el comando, puede usar las claves para ssh y en la máquina remota agregue su usuario al archivo sudoers con el indicador NOPASSWD: ALL. Vea la respuesta de rango más alto en el siguiente enlace. NOTA: No es la respuesta aceptada: askubuntu.com/questions/147241/execute-sudo-without-password
Dave
10

La solución en este blog funcionó muy bien para mí: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Básicamente:

stty -echo; ssh myUser@REMOTE_SERVER "sudo -v"; stty echo  
rsync -avze ssh --rsync-path='sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

La primera línea permite la entrada de contraseña interactiva, sin mostrar la contraseña en la pantalla. Funciona muy bien para mí en Ubuntu 9.04.

Andrés
fuente
1
Esto requiere la opción tty_tickets ser desarmado: !tty_tickets.
azulado
2
¿Qué tal en ssh -t [other options]lugar de jugar con stty -echo?
Ivan Vučica
En mi caso, ya lo he desarmado: de tty_ticketstodos modos ... así que puedo probar este enfoque.
MountainX
1
sudo: no tty present and no askpass program specified
Michael
¿Cómo se desarma tty_tickets? En que maquina Durante este comando rsync?
Jonathan
4

Necesita un método para proporcionar la contraseña sudo. Un askpassprograma está diseñado para solicitar contraseñas cuando los mecanismos normales no están disponibles. La configuración sudopara no requerir una contraseña para ejecutarse rsynccomo su ID de usuario es una opción.

Normalmente configuro el inicio de sesión basado en claves con restricciones apropiadas para casos como este. Si configura una clave restringida que solo se ejecuta rsynccomo root, este tipo de cosas se vuelven más fáciles de hacer. Otra alternativa es utilizar un rsycndproceso para manejar las solicitudes remotas. La configuración proporciona una variedad de restricciones que se pueden aplicar.

EDITAR: Incluí un script para configurar claves para loings basados ​​en claves en la sección Crear ID de usuario en clientes de mi publicación sobre Configuración de BackupPC en Linux . Consulte también la documentación de ssh_config que detalla algunas de las cosas que puede hacer para restringir el uso de la clave como se muestra en el script.

BillThor
fuente
Gracias por su ayuda, pero encontré una solución que me funciona mejor.
Peter
algún detalle sobre el inicio de sesión basado en clave
TheVillageIdiot
2

Estoy sorprendido por la complejidad de las respuestas existentes. Es mucho más fácil y conveniente configurar sus sistemas (su PC y el host remoto) para que pueda conectarse como root al host remoto sin usar una contraseña. Y a diferencia de su aspecto, también es seguro .

  1. En el host remoto, asegúrese de que / etc / ssh / sshd_config tenga esta línea "PermitRootLogin sin contraseña" (en muchas distribuciones está allí de forma predeterminada). Esto permite que root obtenga un shell ssh utilizando cualquier método de autenticación, excepto el aviso de contraseña insegura.
  2. (Si aún no sabe cómo) siga cualquiera de los muchos tutoriales sobre cómo obtener un inicio de sesión sin contraseña a través de ssh
  3. Use rsync como lo haría normalmente y sin ninguna solicitud de contraseña.

Simplemente no olvide que mientras la línea en /root/.ssh/authorized_keys del host remoto esté allí, la máquina acepta los comandos raíz de su PC.

ndemou
fuente
rrsync usa este enfoque.
CÓDIGO-LEA
0

Esto es lo que funcionó para mí, teniendo en cuenta que quiero mantener la autenticación de contraseña (por lo que no quiero usar NOPASSWDo claves) - en Ubuntu 14.04:

  • "Abrir" sudoen la máquina remota deshabilitando a tty_ticketstravés de un archivo temporal en /etc/sudoers.d/(que debería ser compatible con Debian, ver /etc/sudoers.d/README), y "Actualizar las credenciales en caché del usuario", que "extiende el tiempo de espera de sudo por otros 15 minutos"
  • Ejecute rsynccon sudocomo se muestra en otras respuestas
  • "Cerrar" sudoen la máquina remota eliminando el archivo temporal en /etc/sudoers.d/, que vuelve a habilitartty_tickets

... o, con líneas de comando:

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'

Estas son las respuestas que obtengo al ejecutar estos comandos en la máquina local:

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
[sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

Tenga en cuenta que sudo -vdebe ejecutarse después de cada archivo de entrada /etc/sudoers.d/, por lo que se aceptan los cambios allí.

sdaau
fuente
0

Otro método es evitar las restricciones de permisos iniciando rsync en la máquina remota. En lugar de:

rsync /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder

Tu puedes hacer:

ssh [email protected] 'rsync [email protected]:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

¿Dónde y.y.y.yestá la dirección IP de su máquina local? Esto solo funciona si su máquina local puede actuar como un servidor SSH.

Keith
fuente
1
Hm ... ¿no estás copiando local a remoto en tu primera línea de comando, y luego en la segunda línea de comando, que debería ser equivalente a la primera, copiando remoto a local (que no es equivalente a la primera)?
sdaau
Whoops! Arreglado.
Keith
0

Mi solución es agregar --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

ejemplo:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

Por lo general, no es una buena idea poner las contraseñas en una línea de comandos de una sola línea; se vuelven visibles en el árbol de procesos, por ejemplo. A veces reemplazo la contraseña real en este tipo de declaración con $ (cat my_password.txt), que es un poco mejor

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"

Bulat
fuente
¿Puedes ampliar esto con un poco de contexto y explicación? "agregar" a qué, dónde? ¿Por qué esto resuelve el problema? Gracias.
Fixer1234