crontab経由でsshエージェントを使用してsshでrsyncコマンドを実行します


18

私はcronjobを持っています:

0 9 * * * rsync -a mydir remote_machine:

「crontab -e」でこれをインストールしました。ssh-agentを実行しています。rsyncコマンド自体を実行すると、ユーザーの操作やパスワードの入力なしで機能しますが、次のメッセージでcronjobが失敗します。

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]

なぜこれが機能しないのですか?私はcronジョブがユーザーとして私と一緒に実行されることを知っています(「* * * * * touch / tmp / a」を実行すると、ファイルを所有しています)ので、秘密鍵を使用してrsyncが私としてログインしていると仮定します...

回答:


10

cronセッションシェルにはsshエージェントに関する知識がないため、通信できません。

エージェントが起動したら、cronセッションがピックアップする場所にエージェントに必要な情報を置くことができます。

例:

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を使用する前に、cronジョブでこれを行う必要があります。

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

...その後、sshセッションは正常に続行します。


すべてのエージェントをスクリプトに入れてからrsyncコマンドを実行しますか、それをcronjobのシェルを開始するときにcronが自動的にロードする.profileまたは.bashrcファイルに配置できますか?
アーロン09

rsyncコマンドを実行するスクリプトにエージェントを配置します。
デビッドマッキントッシュ

3
必要なのは、SSH_AUTH_SOCKおよびSSH_AGENT_PID環境変数(.ssh / agent /の代わりに.ssh-agentに格納する)を取得することだけだったので、これは「0 9 * * *。 -agent && rsync -av $ HOME / mydir remote_machine: "
aaron 09

1
これらはすべて不要です。キーチェーンを使用して
ください-cmcginty

キーチェーンが利用可能である、またはインストールできると言う@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-agent環境変数をロードします。

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

魚の場合:

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

キーにパスフレーズがある場合、キーチェーンは1回尋ねます(マシンを再起動するか、ssh-agentを強制終了するまで有効です)。

注:キーチェーンもにコードを生成cshし、fishこれだけ「-csh」または「-fish」に接尾辞「-SH」を置き換える、シェル。


1
$ HOSTNAMEはcron環境では定義されていませんが、それ以外はこれが最良の解決策です
-cmcginty

rsaキーを使用する場合、キーチェーン〜/ .ssh / id_dsaをキーチェーン〜/ .ssh / id_rsaに変更しますか?
カタファルカス

@Katafalkasまさに!
セメンテ

@Casey答えを更新しました。今はcronと互換性があります。
セメンテ

Fishの説明を改善しました。
イライジャ・リン

2

最初の回答に投票するのに十分な担当者がいませんが、それは私が抱えていた問題を解決しました。ssh-agentに関しては、すでに実行されている場合があります。以下は、ssh-agentの起動時に保存する追加の要素なしで、環境からSSH_AGENT_PIDとSSH_AUTH_SOCKを抽出するスクリプトです。(perlがあると仮定)

以下をスクリプトに入れます。(たとえば、findagent.pl)

cronスクリプト内に次の行を追加します。

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

.ssh / id_rsaは、秘密鍵へのパスです。これは、バックアップを行うために使用している正確な行であり、常に正常に機能します。

よろしくお願いします、
ファビアン


0

別の方法として、sshエージェントを使用する代わりに、rsyncを呼び出す前にRSYNC_RSH = "ssh -i /home/user/.ssh/id_rsa" unset SSH_AGENT_PID unset SSH_AUTH_SOCKをスクリプトにエクスポートさせました。'-e ...'を使用する代わりにRSYNC_RSHに配置することにより、ホストに基づいて使用されているidファイルを簡単に調整できました。

これがお役に立てば幸いです、B


キーにパスフレーズがある場合、これが機能するとは思わない
-cmcginty
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.