Crontab के माध्यम से ssh एजेंट के साथ ssh पर rsync कमांड निष्पादित करें


18

मेरे पास एक क्रोनजॉब है:

0 9 * * * rsync -a mydir remote_machine:

मैंने इसे 'crontab -e' के साथ स्थापित किया। मेरे पास एक ssh- एजेंट चल रहा है, और जब मैं rsync कमांड निष्पादित करता हूं तो यह w / o किसी भी उपयोगकर्ता इंटरैक्शन या पासवर्ड प्रविष्टि पर काम करता है, लेकिन निम्नलिखित संदेश के साथ क्रोनजोब विफल हो जाता है:

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]

यह काम क्यों नहीं करता है मुझे पता है कि क्रोनॉजर्स w / me को उपयोगकर्ता के रूप में चलाता है (अगर मैं * * * * * * टच / tmp / a 'i फाइल का मालिक हूं) तो मुझे लगता है कि rsync मुझे अपनी निजी कुंजी का उपयोग करते हुए लॉग इन कर रहा है ...

जवाबों:


10

आपके क्रोन सत्र शेल में ssh एजेंट का कोई ज्ञान नहीं है, इसलिए इससे बात नहीं कर सकते।

जब एजेंट शुरू किया जाता है, तो आप एजेंट के लिए आवश्यक जानकारी को क्रोन सत्र के लिए उठा सकते हैं।

उदाहरण:

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

फिर एजेंट में अपनी कुंजी जोड़ें।

ssh-add $HOME/.ssh/id_dsa

अब आपका क्रॉन जॉब ssh का उपयोग करने का प्रयास करने से पहले करना चाहिए:

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

... उसके बाद, ssh सत्र सामान्य रूप से आगे बढ़ना चाहिए।


इसलिए मैं rsync कमांड के बाद एक स्क्रिप्ट में सभी एजेंट सामान रखता हूं, या क्या मैं इसे किसी लाभकारी या या .bashrc फ़ाइल में डाल सकता हूं जब क्रोनज के लिए एक शेल शुरू होता है तो क्रोन स्वचालित रूप से लोड होता है?
अरोन

मैं rsync कमांड चलाने वाली स्क्रिप्ट में एजेंट सामान रखूँगा।
डेविड मैकिन्टोश

3
सभी की ज़रूरत मुझे SSH_AUTH_SOCK और SSH_AGENT_PID env चर स्रोत करने के लिए थी (मैंने उन्हें .sh / एजेंट / के बजाय .ssh- एजेंट में डाल दिया था) तो यह वही था जो मैं समाप्त हो गया था: "0 9 * * * *। $ HOME / .sh -agent && rsync -av $ HOME / mydir Remote_machine: "
aaron

1
यह सब अनावश्यक है,
किचेन

@ cmcginty जो कहते हैं कि किचेन उपलब्ध है, या स्थापित किया जा सकता है?
zb226

19

चाबी का गुच्छा क्या आप की जरूरत है! बस इसे स्थापित करें और अपने .bash_profile(या समतुल्य) में अनुसरण कोड जोड़ें :

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

Config.fish के लिए ( 2 ):

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

फिर ssh- एजेंट पर्यावरण चर को लोड करने के लिए अपनी स्क्रिप्ट में नीचे दिए गए कोड का उपयोग करें:

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

मछली के लिए:

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

यदि आपकी कुंजी में पासफ़्रेज़ है, तो चाबी का गुच्छा आपसे एक बार पूछेगा (जब तक आप मशीन को रिबूट नहीं करते या ssh- एजेंट को मारते हैं)।

नोट: चाबी का गुच्छा भी कोड cshऔर fishगोले उत्पन्न करता है , इसलिए बस प्रत्यय "-sh" को "-श" या "-फिश" को बदलें।


1
$ HOSTNAME को क्रोन वातावरण में परिभाषित नहीं किया गया है, लेकिन इसके अलावा यह सबसे अच्छा समाधान है
cmcginty

अगर मैं rsa कुंजियों का उपयोग करता हूं, तो क्या मैं चाबी का गुच्छा ~ / .sh / id_dsa को चाबी का गुच्छा ~ / .ssh / id_rsa में बदल दूं?
कातफल्कस

@ कटकफ़लस बिल्कुल!
१e

@ कैसी मैंने अपना जवाब अपडेट कर दिया है। अब क्रोन के साथ संगत है।
semente

मैंने मछली के लिए बेहतर निर्देश जोड़े।
एलिय्याह लिन

2

मेरे पास पहले उत्तर को वोट करने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन इसने उस समस्या को हल कर दिया जो मैं कर रहा था। Ssh- एजेंट के संदर्भ में, आपके पास पहले से ही एक चल सकता है। SSH_AGENT_PID और SSH_AUTH_SOCK को निकालने के लिए एक स्क्रिप्ट है जो बिना किसी अतिरिक्त सामान के ssh- एजेंट के स्टार्टअप पर सहेजने के लिए पर्यावरण से है। (मान लें कि आपके पास पर्ल है)

निम्नलिखित को एक स्क्रिप्ट में रखें। (उदाहरण के लिए findagent.pl)

और अपने क्रोन स्क्रिप्ट के अंदर लाइन जोड़ें:

eval `{स्क्रिप्ट का रास्ता} / 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

मुझे लगता है कि आप दूरस्थ मशीन से खुद को प्रमाणित करने के लिए कुंजी आधारित आधार का उपयोग कर रहे हैं। नीचे की रेखा आज़माएं:

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

जहाँ .sh / id_rsa आपकी निजी कुंजी का पथ है। यह सटीक लाइन है जिसका उपयोग मैं अपना बैकअप करने के लिए कर रहा हूं और यह हमेशा मेरे लिए ठीक काम करता है।

शुभकामनाएं,
फैबियन


0

एक विकल्प के रूप में, मैंने ssh एजेंट का उपयोग करने के बजाय अपनी स्क्रिप्ट बनायी निर्यात RSYNC_RSH = "ssh -i /home/user/.ssh/id_rsa" unset SSH_AGENT_PID को SSH_AUTH_SOCK करने से पहले rsync का उपयोग करने से पहले निर्यात करें। इसे RS -NC_RSH में डालने के बजाय '-e ...' का उपयोग करके होस्ट के आधार पर उपयोग की जा रही आईडी फ़ाइल को समायोजित करना आसान बना दिया।

आशा है कि यह मदद करता है, बी


मुझे नहीं लगता कि यह काम करता है यदि आपके पास आपकी कुंजी पर एक
सेमीफ्रेज है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.