2

私は現在、他の誰かが CentOS 6 サーバーに残した混乱を片付けています。6 時間ごとに github アカウントにバックアップする必要があるアプリケーションがあります。データの準備を処理するスクリプトがあり、それが git add と git commit を処理します。

git push は「expect」スクリプトによって処理されます。これは、ssh が要求したときにパスフレーズを git push に渡すことができるようにするためです。ユーザーは空のパスフレーズを使用したくありません。

root ユーザーが bash シェルのコマンド ラインから実行すると、スクリプトは正常に実行されます。github に転送されたファイルが表示されます。

root によって作成された crontab でスクリプトを実行すると、スクリプトは実行されているように見えますが、git push は行われません。手動で git push を実行すると、スクリプトが失敗した後に、コマンド ラインから呼び出した手動のプッシュと一緒に、発生するはずだったプッシュが発生することに気付きます。スクリプトで発生するはずだったプッシュがキャッシュされ、github にプッシュされていないようです。

ここで私が欠けているものを誰かが提案できますか? このようなスクリプト内で git push を機能させることは可能ですか?

よろしく

リチャード

4

1 に答える 1

1

この問題は、git push を実行しようとしたときに、パスフレーズが ssh-agent によって ssh に正しく渡されないことにあるはずです。

フォローアップのブログ投稿に示されているように、単に cron を呼び出すことはできませんssh-agent -s。そうしないと、キーを含まない別のインスタンスが作成されるだけです。

これを修正するには、別のプロセスを開始しないようにする方法を見つける必要がssh-agentありました。代わりに、ログインするたびに開始される 1 つのタツノオトシゴにアクセスできるようにする必要がありました。
既存の ssh-agent プロセス ID を検索するように crontab を変更しました。および認証ソケットを作成し、それらを cron 環境にインポートします。これは一種のハックですが、実際には機能します (前回とは異なります)。
SSH サーバーに接続する前に、スクリプトに以下を追加するだけです (または、私が行ったことを実行して、セミコロンで区切って cron ジョブに入れます)。

export SSH_AGENT_PID=`ps -a | grep ssh-agent | grep -o -e [0-9][0-9][0-9][0-9]`
export SSH_AUTH_SOCK=`find /tmp/ -path '*keyring-*' -name '*ssh*' -print 2>/dev/null` 

明確にするために:

スクリプトに次を追加するだけです

つまり、上記の 2 行は、cron ジョブとして宣言され、その cron ジョブによって呼び出されるスクリプトの一部です。

それらをセミコロンで区切ってcronジョブに直接入れます

スクリプトが十分に小さい場合は、スクリプトを完全に削除して、cron ジョブを一連のコマンドにすることができます。「 crontab で 2 つのコマンドを実行する」を参照してください。

crontab -l | { cmd1; cmd2 ; cmd3; } | crontab -

この構文は、プログラムでコマンドを cron ジョブに追加する方法の 1 つにすぎません。

于 2013-05-16T06:34:00.203 に答える