6

このスクリプトをまとめて、分岐した Github リポジトリのフォルダーを毎日更新しました。プロンプトから呼び出すと問題なく動作しますが、cron ジョブとして実行するときに id_rsa を確実に利用する方法がわかりません。これeval 'ssh-agent'はまさにそれを行う試みですが、プラスの影響は見られません。

#!/bin/sh
LOGPATH=log.txt
eval 'ssh-agent'
cd /path/to/update/folder
echo "-------START UPDATE-------">$LOGPATH
echo "Updating repos:">>$LOGPATH
date "+%F %T">>$LOGPATH
COUNT=1
find . -maxdepth 1 -type d | while read dir; do
cd "$dir"
LEN=$"${#dir}"
if [ $LEN != "1" ]
    then
    echo "*********">>$LOGPATH
    echo "$COUNT. " ${dir:2}>>$LOGPATH
    /usr/local/bin/git pull upstream master>>$LOGPATH 2>> $LOGPATH
    /usr/local/bin/git push origin master>>$LOGPATH 2>> $LOGPATH
    let COUNT=COUNT+1
fi
cd "$OLDPWD"
done
echo "-------END UPDATE-------">>$LOGPATH
exit 0

これはおそらく、一般的にプロセスを進めるには恐ろしく非効率的な方法ですが、うまくいき、私はそれを見たことがありません. 私の信用を使うことができたら、私は大喜びするでしょう。

4

2 に答える 2

7

間違った種類の引用符を使用していると思います。プレーンクォート ssh-agent は何もしません。次のコマンド置換を使用して、実行結果を組み込む必要があります。

eval `ssh-agent`

また

eval $(ssh-agent)

これにより、スクリプトは必要な環境変数を設定します。ただし、ssh-agentキーがない限り、キーはありませんssh-add。キーにパスフレーズがない場合ssh-addは、スクリプトから簡単に実行できます。

秘密鍵にパスフレーズがある場合は、このスクリプトを cron ジョブではなくデーモンとして実行することをお勧めします。これにより、エージェントに接続して秘密鍵を追加できます。

スクリプトがコマンド ラインから機能する本当の理由は、デスクトップ環境がおそらく実行ssh-agent中であり、必要な環境変数がすべてのターミナル ウィンドウに伝播されるように調整するためです。(それらを子にして変数を継承するか、シェルに必要なコマンドを提供させることによって。)ssh-add通常のワークフローのある時点で実行していると思いますか?

于 2009-11-04T02:49:50.093 に答える
2

このssh-agentプロセスは、ssh-addパスフレーズを追加するために使用する機能のみを提供します。キーが自動的に使用可能になるわけではありません (秘密キーは、パスフレーズなしでは復号化できません)。

これを行うには、パスフレーズのないキーを作成し、それを cron ジョブから使用する必要があります。パスフレーズのないキーを使用する場合は、通常の安全上の警告が適用されます。

于 2009-11-04T02:45:38.657 に答える