
Esto me parece muy complicado.
He configurado mis dos sistemas para poder rsync
archivos entre ellos como yo, sin especificar contraseña. Ahora el problema son los rsync
archivos que pertenecen a root
. En mis dos sistemas, no hay contraseñas de root. La única manera de convertirse en root es a través de sudo
. Por lo tanto, no puedo dar una contraseña sudo rsyn local root@remote:
ni usar mi agente ssh para proporcionar una frase de contraseña. No quiero configurar una contraseña de root en ningún sistema; y necesito que los archivos sean propiedad de root en ambos sistemas.
EDITAR: Usar los archivos que pertenecen root
es solo un ejemplo, necesito una forma para que mi cuenta sin privilegios lea/escriba archivos del sistema (incluidos los de propiedad raíz) fácilmente. Un ejemplo es copiar mi entorno /root configurado en el sistema recién instalado. Los dos sistemas son en realidad dos máquinas virtuales bajo un solo host, por lo que no es una gran preocupación para mí copiar archivos de propiedad raíz entre ellos.
EDITAR 2: Si solo quiero copiar mi entorno /root configurado en el sistema recién instalado, puedo usar tar:
sudo tar cvzf - /root | ssh me@remote sudo tar xvzf - -C /
Pero necesito rsync
actualizar de vez en cuando. ¿Alguna manera fácil de hacerlo realidad?
EDITAR 3: formule formalmente la pregunta
Muy bien, todo comenzó con la pregunta de cómo almacenar rsync
archivos que pertenecen a la raíz entre dos sistemas como un usuario normal sin privilegios, sin especificar una contraseña, con la condición de que:
- La
root
cuenta está bloqueada en ambos sistemas. Es decir, no hayroot
contraseñas. La única forma de convertirse en root es a través desudo
(práctica de seguridad recomendada, consultehttp://help.ubuntu.com/community/RootSudo) - No quiero estar completamente sin contraseña,
sudo
pero tampoco quiero estar escribiendo contraseñas todo el tiempo. - El usuario normal sin privilegios ha introducido su frase de contraseña ssh en el agente ssh.
Gracias
Respuesta1
Puedes hacerlo directamente con rsync con el uso creativo de --rsync-path
la opción. Entonces usarías:
rsync -a -e "ssh" --rsync-path="sudo rsync" localdir/ [email protected]:/remotedir
Tenga en cuenta que esto requiere que "sudo rsync" en el host remoto NO solicite una frase de contraseña. Esto se puede lograr de varias maneras:
- haciendo
sudo -v
de forma remota antes de ejecutar rsync (ideal para trabajos únicos de rsync). Su sudo no debe usartty_tickets
la opción para que esto funcione. - instalar
username ALL= NOPASSWD:/usr/bin/rsync
en/etc/sudoers
un host remoto. - usandoautenticación-agente-ssh-pamen control remoto para
/etc/pam.d/sudo
Por supuesto, también podría, en lugar de "rsync over ssh", usar "rsync en modo demonio" (consulte rsyncd.conf(5)
y /etc/default/rsync
en Debian GNU/Linux, por ejemplo) para lograr lo que desea, con el beneficio adicional de una mejor velocidad de transferencia.
Respuesta2
La solución.
- Agregar la clave ssh del usuario a la raíz remota funciona, pero solo a mitad de camino, es decir, ahora
rsyn ... root@remote:...
funciona. La parte desafiantesudo rsyn ...
también es conseguir trabajo. - Para conseguir
sudo rsyn ...
trabajo, lo que se necesita es: usar el agente SSH para la autenticación sudo,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/ - Para instalar el módulo PAM pam-ssh-agent-auth en Ubuntu, puede usar el ppa que acabo de crear,https://launchpad.net/~suntong001/+archive/ppa. Probado bien en Ubuntu 12.04 preciso y 13.10 picante.
HT
Respuesta3
Otra forma sería crear un script .sh en ambos servidores, que contenga sus scripts rsync.
Luego ejecútelos mediante cronjob o mediante ssh:
ssh not-your-root-user@remoteserver sudo sh your-rsync-script.sh
O simplemente ejecute su script rsync directamente a través de ssh
ssh not-your-root-user@remoteserver sudo rsync local root@remote
Preferiría cronjob si es un trabajo rsync programado.
Respuesta4
Bueno, depende de lo que quieras hacer. ¿Es necesario que los archivos sean propiedad de root en ambos sistemas? No lo harán si simplemente está haciendo una copia de seguridad para poder ejecutarlo rsync
como root pero iniciando sesión en el servidor remoto como su usuario normal.
Cree una clave para que local root
inicie sesión como usuario normal remoto (la usaré xpt
como su nombre de usuario normal):
sudo -i
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub xpt@remote
Ahora deberías poder hacer una operación sin contraseña ssh
o rsync
(como root) así:
rsync /path/to/local xpt@remote
Si los archivos deben ser propiedad del root en ambos sistemas, las cosas se vuelven un poco más complejas. Lo más fácil sería simplemente configurar una contraseña de root en ambos sistemas:
sudo -i
passwd
Ahora puedes iniciar sesión como root a tu gusto.
Por supuesto, elmejorlo que se podría hacer seríano copiar archivos a través de la red como root. Realmente no puedo imaginar por qué querrías hacerlo y el riesgo realmente no vale la pena, simplemente copia los archivos y juega con ellos sudo
según sea necesario una vez que los hayas copiado.
ACTUALIZAR:
Repito que la forma más sencilla de hacer esto es crear una contraseña de root para cada máquina y luego copiarla como root. No entiendo por qué no quieres esto, es tan simple como ejecutar sudo passwd
.
De todos modos, si insistes en que no quieres crear una contraseña de root, la única forma de evitarlo que veo es ejecutar dos comandos:
Ejecute
rsync
para copiar a un directorio grabable por el usuario (yo usomktmp
para crear un nombre de directorio aleatorio):dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
Mover el contenido a
remote:/root
ssh -t lacoloc@badabing sudo rsync -avz "$dir"/* /root
La
-t
opción fuerza la asignación de tty y es necesaria para ejecutarsudo
comandos en el sistema remoto.
Puedes combinar los dos agregando esto a tu ~/.bashrc
archivo (avísame si no usas bash):
function Rrsync(){
dir=`mktemp -u` &&
sudo rsync -avz $1 $2:$dir &&
ssh -t $2 sudo rsync -avz $dir/ $3 && rm -rf $dir
}
Luego puedes llamar a la función de esta manera:
Rrsync /root xpt@remote /root
------ ----- ---------- -----
| | | |---> The target directory on the remote server
| | |------------> username@server
| |--------------------> Path to local source directory
|--------------------------> The function name
Tenga en cuenta que es posible que tenga que jugar agregando/eliminando una barra diagonal /
del origen y los destinos de rsync dependiendo de si está copiando un directorio o el contenido del directorio. Ver man rsync
.
Para que esto funcione sin contraseña, tendrás que ejecutarlo ssh-keygen
como ssh-copy-id
root como describí al principio. Aún tendrá que ingresar su contraseña para los dos sudo
comandos, una vez para su máquina local y otra para la remota.