18 votos

Ejecutar comando rsync sobre ssh con un ssh agente mediante crontab

Tengo una tarea programada:

0 9 * * * rsync -a mydir remote_machine:

He instalado esto con 'crontab -e'. Tengo un ssh-agent corriendo y cuando ejecuto el comando rsync sí mismo funciona sin ninguna interacción con el usuario o contraseña entrada, pero falla la tarea programada con el siguiente mensaje:

Date: Wed,  9 Dec 2009 11:11:00 -0600 (CST)
From: Cron Daemon <me@my_machine.my_domain>
To: me@my_machine.my_domain
Subject: Cron <me@my_machine> rsync -a /home/me/mydir remote_machine:

Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-35.2/rsync/io.c(452)
[sender=2.6.9]

¿por qué no funciona esto? Sé los cronjobs w / me como usuario (si corro ' * **** tocar/tmp/a ' tengo el archivo) así que supongo que está registrando el rsync como yo con mi clave privada...

9voto

Teutonkat117 Puntos 1

llavero es lo que usted necesita! Sólo tiene que instalar y añadir el código siga en su .bash_profile (o equivalente):

if [ -x /usr/bin/keychain ]; then
  /usr/bin/keychain --quiet --clear $HOME/.ssh/id_rsa
fi

Si la clave tiene un passhphrase, llavero le preguntará una vez (válido hasta que se reinicie la máquina o matar el ssh-agent).

Para utilizar el código siguiente en la secuencia de comandos para cargar el ssh-agent variables de entorno:

. ~/.keychain/`/bin/hostname`-sh

Nota: llavero también genera código para csh y fish conchas, por lo que basta con sustituir el sufijo "-sh" a "-csh" o "peces".

2voto

mutsu Puntos 21

No tengo suficiente rep votar a favor de la primera respuesta, pero resuelto el problema que estaba teniendo. En términos de ssh-agent, puede que ya tenga uno en ejecución. He aquí una secuencia de comandos para extraer el SSH_AGENT_PID & SSH_AUTH_SOCK del medio ambiente sin ningún tipo de cosas adicionales para guardar en el inicio de ssh-agent. (Se supone que tiene perl)

Pon lo siguiente en una secuencia de comandos. (por ejemplo findagent.pl)

y dentro de tu script cron añadir la línea:

eval `{ruta de acceso a script}/findagent.pl`


\#!/usr/bin/perl -w
use strict;
my $agents = `ls -tr /tmp/ssh-*/*`;
my @agents;
(@agents) = split/\n/,$agents;

my $sshpid = `ps aux|grep ssh-agent|grep -v grep|awk '{print \$2}'|head -1`;
chomp($sshpid);
my @parts;
for (@agents) {
  chomp($_);
  if (!$_) { next; }
  my $agentfile = $_;
  (@parts) = split/\./,$agentfile;
  my $masterpid = `ps aux|grep $parts[1]|grep enlightenment`;
  if ($agentfile =~ m/$parts[1]/) {
    my $line1 = "SSH_AUTH_SOCK=" . $agentfile . '; export SSH_AUTH_SOCK';
    my $line2 = 'SSH_AGENT_PID=' . $sshpid . '; export SSH_AGENT_PID;';
    my $line3 = 'echo Agent pid ' . $sshpid . ';';
    print("$line1\n$line2\n$line3\n");
    last;
  } else {
    next;
  }
}

1voto

halfdan Puntos 556

Supongo que estás usando autenticación basado en claves para autenticarse con el equipo remoto. Pruebe la línea de abajo:

rsync -av --delete -e "ssh -i .ssh/id_rsa" mydir user@host.tld:~/backupDir

Donde .ssh/id_rsa es la ruta a su clave privada. Esta es la línea exacta que estoy usando para hacer mis copias de seguridad y siempre funciona bien para mí.

Mucha suerte
Fabian

0voto

Ari Puntos 156

La shell de sesión cron no tiene conocimiento de la ssh agente, así que no se puede hablar con él.

Cuando se inicia el agente, usted puede poner la información necesaria para que el agente en alguna parte de la sesión de cron recoger.

Ejemplo:

AGENT="ssh-agent -s"
if [ ! -d $HOME/.ssh/agent ]; then
        mkdir -p $HOME/.ssh/agent
fi
#
# Start an agent if there isn't one running already.
#
pid=`ps -u$LOGNAME | grep ssh-age | awk '{print $1}'`
if [ -z "$pid" ]; then
        $AGENT | grep -v echo > $HOME/.ssh/agent/$HOST & pid=$!
        sleep 1 # Let it fork and stuff
fi

Luego agregar la llave al agente.

ssh-add $HOME/.ssh/id_dsa

Ahora su tarea de cron debe hacer esto antes de intentar usar ssh:

#
# Get our parent to pick up the required SSH env vars.
#
. $HOME/.ssh/agent/$HOST

... después de que el ssh sesión debe proceder normalmente.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: