Führen Sie den Befehl rsync über ssh mit einem ssh-Agenten über crontab aus

18

Ich habe einen Cronjob:

0 9 * * * rsync -a mydir remote_machine:

Ich habe dies mit 'crontab -e' installiert. Ich habe einen ssh-Agent ausgeführt, und wenn ich den Befehl rsync selbst ausführen, funktioniert es ohne Benutzerinteraktion oder Kennworteingabe, aber der Cronjob schlägt mit der folgenden Meldung fehl:

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]

warum funktioniert das nicht Ich weiß, dass die Cronjobs mit mir als Benutzer ausgeführt werden (wenn ich '* * * * * touch / tmp / a' besitze, gehe ich davon aus, dass sich der Rsync mit meinem privaten Schlüssel als ich anmeldet ...

Aaron
quelle

Antworten:

10

Ihre Cron-Session-Shell kennt den ssh-Agenten nicht und kann daher nicht mit ihm sprechen.

Wenn der Agent gestartet wird, können Sie die Informationen, die der Agent benötigt, an einem Ort ablegen, damit die Cron-Sitzung sie abruft.

Beispiel:

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

Fügen Sie dann Ihren Schlüssel dem Agenten hinzu.

ssh-add $HOME/.ssh/id_dsa

Jetzt sollte Ihr Cron-Job dies tun, bevor Sie versuchen, ssh zu verwenden:

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

... danach sollte die ssh-Sitzung normal ablaufen.

David Mackintosh
quelle
Muss ich alle Agenten-Informationen in ein Skript einfügen, auf das der Befehl rsync folgt, oder kann ich diese Informationen in eine .profile- oder .bashrc-Datei einfügen, die cron automatisch lädt, wenn eine Shell für einen Cronjob gestartet wird?
Aaron
Ich würde das Agentenmaterial in das Skript einfügen, das den Befehl rsync ausführt.
David Mackintosh
3
Alles, was ich brauchte, war, die env-Variablen SSH_AUTH_SOCK und SSH_AGENT_PID zu erzeugen (ich habe sie in .ssh-agent anstelle von .ssh / agent / abgelegt) -agent && rsync -av $ HOME / mydir remote_machine: "
Aaron
1
All dies ist unnötig, verwenden Sie keychain
cmcginty
@cmcginty wer sagt, dass der Schlüsselbund verfügbar ist oder installiert werden kann?
zb226
19

Schlüsselbund ist was Sie brauchen! Installieren Sie es einfach und fügen Sie den folgenden Code in Ihrem .bash_profile(oder einem gleichwertigen) hinzu:

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

Für config.fish ( 2 ):

if not status --is-interactive
   keychain --eval --quiet --quick $HOME/.ssh/id_rsa
end

Verwenden Sie dann den folgenden Code in Ihrem Skript, um die Umgebungsvariablen von ssh-agent zu laden:

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

Für Fische:

source $HOME/.keychain/(hostname)-fish

Wenn Ihr Schlüssel eine Passphrase hat, werden Sie vom Schlüsselbund einmal gefragt (gültig, bis Sie den Computer neu starten oder den ssh-agent beenden).

Hinweis: Der Schlüsselbund generiert auch Code für cshund fishShells. Ersetzen Sie daher einfach das Suffix "-sh" durch "-csh" oder "-fish".

semente
quelle
1
$ HOSTNAME ist nicht in der Cron-Umgebung definiert, aber ansonsten ist dies die beste Lösung
cmcginty
Wenn ich RSA-Schlüssel verwende, ändere ich den Schlüsselbund ~ / .ssh / id_dsa in den Schlüsselbund ~ / .ssh / id_rsa?
Katafalkas
@Katafalkas genau!
Semente
@Casey Ich habe meine Antwort aktualisiert. Jetzt ist kompatibel mit Cron.
Semente
Ich habe bessere Anweisungen für Fisch hinzugefügt.
Elijah Lynn
2

Ich habe nicht genug Repräsentanten, um die erste Antwort abzustimmen, aber es hat das Problem gelöst, das ich hatte. In Bezug auf ssh-agent ist möglicherweise bereits einer aktiv. Hier ist ein Skript zum Extrahieren von SSH_AGENT_PID & SSH_AUTH_SOCK aus der Umgebung, ohne dass beim Start von ssh-agent zusätzliche Daten gespeichert werden müssen. (Angenommen, Sie haben Perl)

Fügen Sie Folgendes in ein Skript ein. (zum Beispiel findagent.pl)

Fügen Sie in Ihrem Cron-Skript die folgende Zeile hinzu:

eval `{Pfad zum Skript} / 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;
  }
}
mutsu
quelle
1

Ich nehme an, Sie verwenden die schlüsselbasierte Authentifizierung, um sich beim Remote-Computer zu authentifizieren. Probieren Sie die folgende Zeile aus:

rsync -av --delete -e "ssh -i .ssh/id_rsa" mydir [email protected]:~/backupDir

Wobei .ssh / id_rsa der Pfad zu Ihrem privaten Schlüssel ist. Dies ist die genaue Zeile, die ich für meine Backups verwende, und sie funktioniert bei mir immer einwandfrei.

Beste Grüße,
Fabian

Halfdan
quelle
0

Anstatt den ssh-Agenten zu verwenden, habe ich mein Skript veranlasst, RSYNC_RSH = "ssh -i /home/user/.ssh/id_rsa" zu exportieren, um SSH_AGENT_PID zu deaktivieren und SSH_AUTH_SOCK zu deaktivieren, bevor rsync aufgerufen wird. Durch das Einfügen in RSYNC_RSH anstelle von '-e ...' war es einfach, die verwendete ID-Datei basierend auf dem Host anzupassen.

Hoffe das hilft, B


quelle
Ich glaube nicht, dass dies funktioniert, wenn Sie eine Passphrase auf Ihrem Schlüssel haben
cmcginty