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

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.


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


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;
  }
}

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 user@host.tld:~/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


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


Ich glaube nicht, dass dies funktioniert, wenn Sie eine Passphrase auf Ihrem Schlüssel haben
— cmcginty
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.