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


Ich habe einen Cronjob:

0 9 * * * rsync -a mydir remote_machine:

Ich habe das mit 'crontab -e' installiert. Ich habe einen ssh-Agent ausgeführt, und wenn ich den rsync-Befehl selbst ausführen, funktioniert es ohne Benutzerinteraktion oder Passworteingabe, 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 kenne die Cronjobs w / mich als Benutzer ausgeführt (wenn ich laufe '* * * * * touch / tmp / a' i besitzen die Datei), so dass ich davon ausgehen, das rsync in wie mir loggt meine privaten Schlüssel ...


18
2017-12-09 17:20


Ursprung




Antworten:


Ihre Cron-Session-Shell kennt den ssh-Agenten nicht und kann daher nicht darauf zugreifen.

Wenn der Agent gestartet wird, können Sie die Informationen, die für den Agenten benötigt werden, an einem Ort ablegen, an dem die Cron-Sitzung aufgenommen werden soll.

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


10
2017-12-09 17:37



also lege ich alle Agent-Sachen in ein Skript, gefolgt vom rsync-Befehl, oder kann ich das in eine .profile- oder .bashrc-Datei einfügen, die automatisch geladen wird, wenn Cron eine Shell startet? - aaron
Ich würde den Agent-Kram in das Skript schreiben, das den rsync-Befehl ausführt. - David Mackintosh
alles, was ich brauchte, war die SSH_AUTH_SOCK und SSH_AGENT_PID env Variablen zu beziehen (i setzte sie in .ssh-Agenten statt .ssh / Mittel /) und so war es, was ich am Ende mit: „0 9 * * * $ HOME / .ssh. -agent && rsync -av $ HOME / mydir remote_maschine: " - aaron
All dies ist unnötig, benutze Schlüsselbund - cmcginty
@ cmcginty wer sagt, dass keychain verfügbar ist oder installiert werden kann? - zb226


Schlüsselanhänger ist was du brauchst! Installieren Sie es einfach und fügen Sie den folgenden Code in Ihrem ein .bash_profile (oder gleichwertig):

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 ssh-agent-Umgebungsvariablen zu laden:

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

Für Fische:

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

Wenn Ihr Schlüssel eine Passphrase hat, wird der Schlüsselbund Sie einmal fragen (gültig bis Sie den Rechner neu starten oder den ssh-agent beenden).

Hinweis: Keychain generiert auch Code für csh und fish Shells, ersetzen Sie einfach das Suffix "-sh" durch "-csh" oder "-fish".


17
2018-02-16 21:03



$ HOSTNAME ist nicht in Cron-Umgebung definiert, aber abgesehen davon ist dies die beste Lösung - cmcginty
Wenn ich rsa-Schlüssel verwende, ändere ich keychain ~ / .ssh / id_dsa zu keychain ~ / .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


Ich habe nicht genug Repräsentanten, um die erste Antwort zu wählen, aber sie löste das Problem, das ich hatte. In Bezug auf ssh-agent haben Sie möglicherweise bereits eine ausgeführt. Hier ist ein Skript, um die SSH_AGENT_PID & SSH_AUTH_SOCK aus der Umgebung zu extrahieren, ohne dass beim Start von ssh-agent zusätzliche Daten gespeichert werden müssen. (Angenommen, Sie haben Perl)

Schreiben Sie folgendes in ein Skript. (zum Beispiel findagent.pl)

und in deinem Cron-Skript füge die Zeile hinzu:

eval `{Pfad zu 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;
  }
}

2
2018-02-11 16:49





Ich nehme an, Sie verwenden die Authentifizierung auf Schlüsselbasis, um sich mit dem Remote-Computer zu authentifizieren. Probieren Sie die folgende Zeile aus:

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

Wo .ssh / id_rsa ist der Pfad zu Ihrem privaten Schlüssel. Dies ist die genaue Linie, die ich verwende, um meine Backups zu machen, und es funktioniert immer gut für mich.

Schöne Grüße,
Fabian


1
2017-12-09 17:35





Als Alternative, anstatt den ssh-Agenten zu verwenden, habe ich mein Skript gemacht   export RSYNC_RSH = "ssh -i /home/user/.ssh/id_rsa"   nicht gesetzt SSH_AGENT_PID   unset SSH_AUTH_SOCK bevor rsync aufgerufen wird. Indem Sie es in RSYNC_RSH einfügen, anstatt "-e ..." zu verwenden, war es einfach, die verwendete ID-Datei basierend auf dem Host anzupassen.

Hoffe das hilft, B


0
2018-02-23 20:37



Ich denke nicht, dass das funktioniert, wenn Sie eine Passphrase auf Ihrem Schlüssel haben - cmcginty