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 ubuntu@x.x.x.x:/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

¿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.


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 ubuntu@x.x.x.x:/remote/lovely/folder --delete

¡Un poco de misión!


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.


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.


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.


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í.


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 ubuntu@x.x.x.x:/remote/lovely/folder

Tu puedes hacer:

ssh ubuntu@x.x.x.x 'rsync ubuntu@y.y.y.y:/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.


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 ubuntu@x.x.x.x:/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 ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"


¿Puedes ampliar esto con un poco de contexto y explicación? "agregar" a qué, dónde? ¿Por qué esto resuelve el problema? Gracias.
Fixer1234
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.