Svnアクティビティログを開発者に毎晩メールで送信する簡単なスクリプトを作成しました。これまで、svnリポジトリと同じマシンで実行していたので、認証について心配する必要はなく、svnのfile:///アドレススタイルを使用するだけで済みました。
現在、自宅のコンピューターでスクリプトを実行し、リモートリポジトリにアクセスしているため、svn + ssh://パスに変更する必要がありました。 ssh-keyが適切に設定されていれば、通常の状況でsvnリポジトリにアクセスするためにパスワードを入力する必要はありません。
ただし、crontabは私のssh-keys/ssh-agentにアクセスできませんでした。私はこの問題についてウェブ上のいくつかの場所で読みました、そしてそれは解決なしでここにもほのめかされています:
sshがcrontabで失敗するのに、コマンドラインから実行すると成功するのはなぜですか?
私の解決策は、これをスクリプトの先頭に追加することでした。
### TOTAL HACK TO MAKE SSH-KEYS WORK ###
eval `ssh-agent -s`
これはMacOSX10.6で動作するようです。
私の質問は、これはどれほどひどいのか、そしてもっと良い方法はあるのかということです。
Ssh-agent -sを実行すると、後で強制終了する必要があるバックグラウンドプロセスが起動します。したがって、最低限、ハックを次のようなものに変更する必要があります。
eval `ssh-agent -s`
svn stuff
kill $SSH_AGENT_PID
ただし、このハックがどのように機能しているかわかりません。 ssh-addも実行せずにエージェントを実行するだけでは、キーは読み込まれません。おそらく、MacOSのssh-agentは、その マニュアルページ とは異なる動作をしていると言っています。
加えて...
キーにパスフレーズがある場合、キーチェーンは1回要求します(マシンを再起動するか、ssh-agentを強制終了するまで有効です)。
キーホルダーはあなたが必要なものです!それをインストールして、.bash_profileに次のコードを追加するだけです。
keychain ~/.ssh/id_dsa
したがって、スクリプトで以下のコードを使用して、ssh-agent環境変数をロードします。
. ~/.keychain/$HOSTNAME-sh
注:キーチェーンは、cshおよびfishshellへのコードも生成します。
https://serverfault.com/questions/92683/execute-rsync-command-over-ssh-with-an-ssh-agent-via-crontab からコピーされた回答
私も同様の問題を抱えていました。スクリプト(sshキーに依存)は手動で実行すると機能しましたが、crontabで実行すると失敗しました。
を使用して適切なキーを手動で定義する
ssh -i /path/to/key
動作しませんでした。
しかし、最終的に、crontabがSSHを実行しているときにSSH_AUTH_SOCKが空であることがわかりました。理由はよくわかりませんでしたが、
env | grep SSH
戻り値をコピーし、この定義をcrontabの先頭に追加しました。
SSH_AUTH_SOCK="/tmp/value-you-get-from-above-command"
私はここで何が起こっているのかについて深く理解していませんが、それは私の問題を解決しました。 crontabがスムーズに実行されるようになりました。
実行中のssh-agentのpidとソケットを回復する1つの方法は次のとおりです。
SSH_AGENT_PID=`pgrep -U $USER ssh-agent`
for PID in $SSH_AGENT_PID; do
let "FPID = $PID - 1"
FILE=`find /tmp -path "*ssh*" -type s -iname "agent.$FPID"`
export SSH_AGENT_PID="$PID"
export SSH_AUTH_SOCK="$FILE"
done
もちろん、これは、システムにpgrepがインストールされていて、実行されているssh-agentが1つしかないこと、または複数のssh-agentが実行されている場合は、pgrepが最後に見つけたものを使用することを前提としています。
私の解決策(praに基づく)は、スクリプトが失敗した場合でもプロセスを強制終了するようにわずかに改善されました。
eval `ssh-agent`
function cleanup {
/bin/kill $SSH_AGENT_PID
}
trap cleanup EXIT
ssh-add
svn-stuff
自分のマシン(scientific linux 6)でssh-addを呼び出す必要があることに注意してください。
自動化されたパスワード/パスフレーズハックなしで自動化されたプロセスを設定するには、パスフレーズのない別のIdentityFileを使用し、from="automated.machine.com" ...
などで始まるターゲットマシンのauthorized_keysエントリを制限します。
パスフレーズなしで送信マシン用の官民キーセットを作成しました。
ssh-keygen -f .ssh/id_localAuto
(パスフレーズの入力を求められたら、リターンキーを押します)
.ssh/config
にremoteAutoHostエントリを設定しました。
Host remoteAuto
HostName remote.machine.edu
IdentityFile ~/.ssh/id_localAuto
およびremote.machine.edu:.ssh/authorized_keys:
...
from="192.168.1.777" ssh-rsa ABCDEFGabcdefg....
...
その場合、sshはssh-agentまたはkeychainによって提供される外部認証された認証を必要としないため、次のようなコマンドを使用できます。
scp -p remoteAuto:watchdog ./watchdog_remote
rsync -Ca remoteAuto/stuff/* remote_mirror
svn svn+ssh://remoteAuto/path
svn update
...
すでにSSH設定を構成していて、ターミナルからスクリプトが正常に機能すると仮定すると、キーチェーンを使用するのが、crontabでスクリプトが正常に機能することを確認する最も簡単な方法です。上手。
キーチェーンはほとんどのUnix/Linux派生に含まれていないので、ここにステップバイステップの手順があります。
1。OSのバージョンに応じて適切なrpmパッケージを http://pkgs.repoforge.org/keychain/ からダウンロードします。 。 CentOS 6の例:
wget http://pkgs.repoforge.org/keychain/keychain-2.7.0-1.el6.rf.noarch.rpm
2。パッケージをインストールします:
Sudo rpm -Uvh keychain-2.7.0-1.el6.rf.noarch.rpm
3。SSHキーのキーチェーンファイルを生成します。これらのファイルは〜/ .keychainディレクトリにあります。 id_rsaの例:
keychain ~/.ssh/id_rsa
4。SSH認証を使用する最初のコマンドの前の任意の場所で、スクリプトに次の行を追加します。
source ~/.keychain/$HOSTNAME-sh
私は個人的にこれのために追加のプログラムを使用することを避けようとしました、しかし私が試みた他のすべてはうまくいきませんでした。そして、これはうまくいきました。
ここにある他のいくつかの回答(特にvpk)に触発されて、外部スクリプトを必要としない次のcrontabエントリを思いつきました。
PATH=/usr/bin:/bin:/usr/sbin:/sbin
* * * * * SSH_AUTH_SOCK=$(lsof -a -p $(pgrep ssh-agent) -U -F n | sed -n 's/^n//p') ssh hostname remote-command-here
キーチェーンを使用できない場合、およびスクリプトからssh-agentを起動できない場合(たとえば、キーがパスフレーズで保護されているため)に機能するソリューションを次に示します。
これを1回実行します。
Nohup ssh-agent > .ssh-agent-file &
. ssh-agent-file
ssh-add # you'd enter your passphrase here
Cronから実行しているスクリプトでは:
# start of script
. ${HOME}/.ssh-agent-file
# now your key is available
もちろん、これにより、「〜/ .ssh-agent-file」と対応するソケットを読み取ることができるすべてのユーザーがssh資格情報を使用できるようになるため、マルチユーザー環境では注意して使用してください。