Crontab এর মাধ্যমে ssh এজেন্টের সাথে rsync কমান্ড প্রয়োগ করুন


18

আমার একটি ক্রোনজব রয়েছে:

0 9 * * * rsync -a mydir remote_machine:

আমি এটি 'crontab -e' দিয়ে ইনস্টল করেছি। আমার একটি এসএস-এজেন্ট চলছে, এবং যখন আমি নিজেই আরএসআইএনসি কমান্ডটি কার্যকর করি এটি কোনও ব্যবহারকারীর ইন্টারঅ্যাকশন বা পাসওয়ার্ড এন্ট্রি ব্যবহার করে তবে ক্রোনজব নিম্নলিখিত বার্তায় ব্যর্থ হয়:

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]

কেন এই কাজ করে না? আমি জানি যে ক্রোনজবস ডাব্লু / আমাকে ব্যবহারকারী হিসাবে চালান (যদি আমি '* * * * * টাচ / টিএমপি / এ' ফাইলটির মালিক হয়ে থাকি) তাই আমি ধরে নিই যে আরএসসিএন আমার ব্যক্তিগত কী ব্যবহার করে আমাকে লগ ইন করছে ...

উত্তর:


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 অধিবেশনটি স্বাভাবিকভাবে এগিয়ে যাওয়া উচিত।


সুতরাং আমি কী সমস্ত এজেন্ট স্টাফকে একটি স্ক্রিপ্টে আরএসইএনসি কমান্ড অনুসরণ করে রেখেছি বা আমি কিছু কিছু প্রোফাইলে বা .bashrc ফাইলের মধ্যে রাখতে পারি যে ক্রোনজবসের জন্য শেল শুরু করার সময় ক্রোন স্বয়ংক্রিয়ভাবে লোড হয়?
আরোন

আমি এজেন্ট স্টাফ স্ক্রিপ্টে রাখব যা rsync কমান্ড চালায়।
ডেভিড ম্যাকিনটোস

3
আমার যা দরকার ছিল তা হ'ল এসএসএইচ_এইউথ_সক এবং এসএসএইচ_এজিপিপিপি এনভিটি ভেরিয়েবলগুলি (আমি তাদেরকে .ssh / এজেন্টের পরিবর্তে .ssh-এজেন্টে রেখেছি) তাই আমি এটাই শেষ করেছিলাম: "0 9 * * * $ হোম / এসএসএস -agent && rsync -av $ হোম / mydir remote_machine: "
হারুন

1
এই সমস্ত অপ্রয়োজনীয়,
কীচেইন

@ সিএমসিগিন্টি কে বলেছেন কে কীচেন পাওয়া যায়, না ইনস্টল করা যায়?
zb226

19

আপনার যা দরকার তা কীচেইন ! কেবল এটি ইনস্টল করুন এবং আপনার .bash_profile(বা সমমানের) মধ্যে অনুসরণ কোড যুক্ত করুন :

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

কনফিগার.ফিশ ( 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- এজেন্টকে মেরে ফেলা পর্যন্ত বৈধ)।

দ্রষ্টব্য: Keychain এছাড়াও কোড জেনারেট করে cshএবং fishশাঁস, তাই ঠিক প্রত্যয় "-sh 'না করে' -csh" বা "-fish"।


1
$ HOSTNAME ক্রোন পরিবেশে সংজ্ঞায়িত করা হয়নি, তবে এটি ছাড়াও এটিই সেরা সমাধান
সেমিচিন্টি

আমি যদি আরএসএ কী ব্যবহার করি, আমি কি কীচেইন ~ / .ssh / id_dsa কে কীচেইন। / .ssh / id_rsa এ পরিবর্তন করব?
কাটাফালকাস

@ কাটাফলকস ঠিক!

@ ক্যাসি আমি আমার উত্তর আপডেট করেছি। এখন ক্রোন সঙ্গে সামঞ্জস্যপূর্ণ।

আমি ফিশের জন্য আরও ভাল নির্দেশাবলী যুক্ত করেছি।
এলিজা লিন

2

আমার কাছে প্রথম উত্তরটি দেওয়ার মতো যথেষ্ট প্রতিনিধি নেই, তবে এটি আমার যে সমস্যাটি ছিল তা সমাধান করেছে। Ssh- এজেন্টের ক্ষেত্রে, আপনার ইতিমধ্যে একটি চলমান থাকতে পারে। এসএসএইচ-এজেন্টের প্রারম্ভকালে সংরক্ষণের জন্য অতিরিক্ত কোনও স্টাফ ছাড়াই এসএসএইচ_এইজিআইপিআইডি এবং এসএসএইচ_এইউথ_সোককে পরিবেশ থেকে বের করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে। (ধরে নিলেন আপনার পার্ল আছে)

স্ক্রিপ্টে নিম্নলিখিতগুলি রাখুন। (উদাহরণস্বরূপ findagent.pl)

এবং আপনার ক্রোন স্ক্রিপ্টের ভিতরে লাইনটি যুক্ত করুন:

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

1

আমি মনে করি আপনি রিমোট মেশিনের মাধ্যমে প্রমাণীকরণের জন্য কী ভিত্তিক লেখক ব্যবহার করছেন। নীচের লাইনটি ব্যবহার করে দেখুন:

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

যেখানে .ssh / id_rsa হ'ল আপনার ব্যক্তিগত কী-এর পথে key আমি আমার ব্যাকআপগুলি করতে এটি হ'ল লাইন এবং এটি সর্বদা আমার পক্ষে ঠিক কাজ করে।


শুভকামনা , ফ্যাবিয়ান


0

বিকল্প হিসাবে, ssh এজেন্টটি ব্যবহার না করে আমি আমার স্ক্রিপ্টটি আরএসওয়াইএনসি_আরএসএইচ = "এসএসএস-আই / হোম / ইউজার / এসএসইচ / আইডি_আর্সা" রফতানি করিয়েছি এসএসএইচ_এজি / পিআইডি আনসেট করুন এসএসএইচ_এইউথ_সোককে আরএসসিএন চালিত হওয়ার আগে সেট করে না। এটি '-e ...' ব্যবহারের পরিবর্তে আরএসওয়াইএনসি_আরএসএইচে রাখার মাধ্যমে হোস্টের উপর ভিত্তি করে আইডি ফাইলটি ব্যবহার করা সামঞ্জস্য করা সহজ হয়েছে।

আশা করি এটি সাহায্য করবে, বি


আপনার কীতে কোনও পাসফ্রেজ থাকলে এটি কাজ করে বলে আমি মনে করি না
cmcginty
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.