2009-11-04 36 views
6

私は、このスクリプトをまとめてフォークされたGithubリポジトリのフォルダを毎日更新しました。私はプロンプトから呼び出すとうまく動作しますが、cronジョブとして実行されたときにid_rsaを確実に利用する方法を見つけることができます。 eval 'ssh-agent'はこれを行う試みですが、肯定的な影響は見られません。cronジョブを実行しているbashスクリプトからSSH鍵にアクセスする

#!/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 

これはおそらく、一般的にはプロセスを実行するにはひどく非効率的な方法ですが、動作しています。もし私が信用状を使うことができれば、私は喜ぶだろう。

答えて

7

間違った種類の引用符を使用していると思います。 ssh-agentのは、何もしないプレーン引用し、あなたがコマンド置換を使用して、それを実行した結果を組み込む必要があります。これは、スクリプトを設定する原因となる

eval `ssh-agent` 

または

eval $(ssh-agent) 

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

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

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

+0

私はssh-addを実行したことがありませんでしたが、私はOS X上にいるので、私の推測は私のために起こっています。パスフレーズのない鍵を作成してssh-addを使うと、そのトリックが完了したようです。 Gregが提案したように.ssh/configのホストビットもやった。今それは動作します!ありがとう –

2

ssh-agentプロセスでは、ssh-addと一緒に使用してパスフレーズを追加する機能しか提供されません。それは自動的にあなたの鍵を利用可能にしません(あなたの秘密鍵はあなたのパスフレーズなしで解読することはできません)。

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

+0

githubに接続するために特定のキーを使用するようスクリプトに指示するにはどうすればよいですか? –

+2

sshに-iオプションを使用するか、接続しているホストにどのキーファイルを使うかを示す '〜/ .ssh/config'ファイルを設定します。 –

関連する問題