Realizo copias de seguridad frecuentes en una unidad local que quiero sincronizar diariamente con un servidor remoto.
El servidor de destino está configurado para acceso de clave SSH (sin contraseña) solamente. Como mi clave SSH principal para ese servidor está protegida con frase de contraseña, he creado una segunda clave SSH (no protegida con frase de contraseña) + usuario para usar para copias de seguridad desatendidas , de esta manera no tengo que estar presente para ingresar mi frase de contraseña cuando se ejecuta cron .
Estoy usando cron y rsync, y todos los comandos funcionan individualmente, pero fallan cuando se combinan.
Lo más lejos que tengo mientras se ejecuta la solución de problemas
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
que devuelve el error
Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
¿Algún consejo sobre cómo solucionar esto más?
Esto es lo que he intentado hasta ahora y no tengo ideas:
- Cron definitivamente está corriendo
ps aux | grep cron
Nada inusual en / var / log / syslog
Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)
SSH en la Terminal al servidor remoto mientras el usuario de respaldo trabaja
ssh [email protected]
- Ejecutar el comando en la Terminal funciona perfectamente
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
La especificación manual de la ruta a la clave del usuario de copias de seguridad no tiene ningún efecto
rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Reemplazar el comando que no funciona con un comando de prueba simple funciona
echo "Hello world" > ~/Desktop/test.txt
Gritar / insultar a la computadora no tuvo ningún efecto (pero me hizo sentir mejor temporalmente).
Editar 1:
Aquí está mi archivo crontab y el script que llama.
...
# m h dom mon dow command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup
y
#!/bin/bash
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Edición 2:
Solo para aclarar, /var/log/auth.log
en el servidor de destino contiene la línea Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user root
Esto es confuso porque ya no estoy ejecutando cron cada minuto localmente, pero todavía aparece una nueva entrada cada minuto en los registros del servidor. Los archivos de Crontab para todos los usuarios (incluido el root) en el servidor están vacíos y no hacen nada.
Además, el usuario 'solo copias de seguridad' se creó solo en el servidor y con derechos limitados, con una clave SSH dedicada copiada a mi máquina de escritorio. Supongo que este es el camino a seguir porque todo funciona cuando se ejecutan los comandos manualmente.
El archivo crontab publicado anteriormente es para mí, el usuario 'tom' en mi máquina de escritorio. Mi intención es que llame al script que debe iniciar sesión en el servidor como usuario 'solo copias de seguridad'. Acabo de intentar ejecutar el script de copia de seguridad (en lugar del comando dentro de él) y se conectó y funcionó correctamente. Lo ejecuté en mi escritorio como usuario 'tom', el mismo usuario que creó el trabajo cron que no funcionará. Aquí está la salida del registro del servidor correspondiente a ese inicio de sesión exitoso
Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Sep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Sep 7 16:06:02 <hostname> sshd[6747]...
. ¿Estás 100% seguro de que este logline es del servidor y que es la línea correcta? El crontab que publicaste es el crontab de solo copias de seguridad . Además, intente agregar el archivo de identidad manualmente:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
auth.log
que publicó en Editar 2 es para cron que se ejecuta en el servidor, y no debe tener nada que ver con sus intentos de inicio de sesión. ¿Puedes probartail -f /var/log/auth.log
en el servidor mientras intentas ejecutar el script a través de cron? Además, no estoy seguro de si esto funcionaría, pero ¿puedes probar tu primerenv
comandorsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...
para ver si arroja más errores?Respuestas:
Como todo funciona bien desde la línea de comandos, el error
Permission denied (publickey)
significa que la parte SSHrsync
está utilizando un archivo de identidad diferente al nombre de usuario especificado.A partir del comentario de Jan sobre la pregunta original, podemos especificar el archivo de identidad en el
rsync
comando usando-e 'ssh -i /path/to/identity.file' ...
.El uso del siguiente comando para comenzar con un entorno nuevo en cron y especificar la ruta completa al archivo aparentemente resuelve el problema:
Todavía estoy realmente interesado en este hallazgo. Probablemente tenga que ver con cron, el hecho de que comienza con variables de entorno mínimas y el agente ssh. Voy a configurar el mismo escenario en un par de días para probarlo e informar.
fuente
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
Acabo de resolver este problema que me ha mantenido ocupado.
No se puede conectar en RSYNC a través de SSH, a pesar de haber estipulado la identidad para SSH ... No se hace nada ... Rsync dice "permiso denegado" y ssh me dice "read_passphrase: no se puede abrir / dev / tty: Ningún dispositivo o dirección de este tipo"
Pero leí una publicación que explicaba que el crontab tiene su propio entorno que no es lo mismo que root. Ya lo sabía, pero no entendía el impacto que podría tener en SSH al usar el SSH-AGENT
Pero mis intercambios de claves SSH se realizan con PassPhrase ... así que si el entorno es diferente y mi RSYNC sobre SSH espera una frase de contraseña que no se puede ingresar => La información de depuración SSH también indica el error:
En mi máquina, utilizo "Llavero" para que se inicie el agente SSH, de modo que no tenga que volver a ingresar la frase de contraseña cada vez que intento una conexión remota. Keychain genera un archivo que contiene la siguiente información
==> El comando SSH-AGENT devuelve la misma información.
Entonces, al final, es esta información relacionada con la sesión actual la que permite autenticaciones futuras de la sesión actual, sin la necesidad de ingresar la frase de contraseña porque ya se hizo previamente y se memorizó ...
==> La solución está ahí ... es suficiente en la secuencia de comandos iniciada por el crontab, y para "fuente" el archivo que contiene esta información o para hacerlo en la línea de comandos ds el crontab ...
=> Con este abastecimiento, no más preocupaciones. La información de SSH_AUTH_SOCK y SSH_AGENT_PID se carga en el entorno de Crontab y, por lo tanto, se conoce que el RSYNC sobre SSH funciona sin ningún problema.
Me ha mantenido ocupado pero ahora funciona :)
fuente
Advertencia para aquellos que usan SSH Agent Forwarding:
Si ve este comportamiento al depurar un script en un host remoto, es porque incluso con el
-e "ssh -i /path/to/key"
indicador, ssh usará su clave local (reenviada) en lugar de la del servidor.Ejemplo concreto: tengo un script en el servidor de desarrollo que extrae datos del "servidor de datos" usando rsync sobre ssh. Cuando inicio sesión en el servidor de desarrollo y lo ejecuto, todo está bien, pero cuando ejecuto desde cron, obtengo el permiso denegado. Añadiendo algo de verbosidad al proceso SSH (marca
-vv
) noté lo siguiente:Lo que me dio pistas aquí es que, por pura casualidad, tengo un nombre de usuario diferente en el host local ("nighty") que en el servidor de desarrollo ("juanr").
Observe cómo marca la clave en el servidor de desarrollo como "explícita", pero aún utiliza la clave reenviada de mi computadora portátil para iniciar sesión. Hacer una
ssh-copy-id
en este momento no resuelve nada, porque simplemente reinstala la clave reenviada en lugar de la del desarrollador servidor. Si usa ssh-copy-id con el agente de reenvío, es necesario especificar qué tecla se debe instalar con la bandera -i:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
.fuente
¿Ya has probado el viejo truco de limpiar los archivos de host? Quiero decir:
Vale la pena intentarlo, ya que ssh lo reconstruirá y eliminarás las cosas obsoletas. Por supuesto, también puede eliminar las partes que pertenecen a una determinada IP / Host.
Más preguntas: ¿Su trabajo cron se ejecuta bajo su UID o se ejecuta como usuario cron o root?
fuente
~/.ssh/known_hosts
cambiaría algo. Y cron se ejecuta como mi usuario 'tom' en el escritorio, con la intención de iniciar sesión en el servidor como usuario 'solo copias de seguridad' con la correspondiente clave SSH (sin contraseña), que está en el usuario tom~/.ssh
.-r
ni el-f
indicador para eliminar,known_hosts
es un archivo normal (no un directorio) y no es de solo lectura.rm .ssh/known-hosts
sería considerablemente más seguro, teniendo en cuenta que un error tipográfico de un solo carácter: agregar accidentalmente un espacio entre.
yssh/known_hosts
despuésrm -rf
(orm -r
) generalmente eliminaría todo el contenido de la carpeta de inicio del usuario.Use el
rrsync
script junto con una clave ssh dedicada de la siguiente manera:Servidor remoto
Computadora LOCAL
Computadora remota
Anteponga a la línea recién agregada lo siguiente
Para que el resultado se vea como
LOCAL
Ponga en su
crontab
siguiente script conx
permiso:Fuente: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/
fuente
Para probar y depurar, agregue a la parte ssh "ssh -v" de esta manera, puede obtener el modo detallado con información útil.
Editar: desde la página del manual:
fuente
Creo que no ha configurado el archivo sshd_config correctamente. Verifique eso
PermitRootLogin yes
yPubkeyAuthentication yes
para el mantenimiento remoto.fuente
PermitRootLogin
habilitado y no tengo planes de cambiar eso. La mejor práctica es deshabilitarlo y ssh solo como usuario normal (agréguelo a sus 'sudoers' si es necesario) y nunca como root.