web-dev-qa-db-ja.com

ssh-agentとcrontab-これらを満たすための良い方法はありますか?

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で動作するようです。

私の質問は、これはどれほどひどいのか、そしてもっと良い方法はあるのかということです。

30
Michael H.

Ssh-agent -sを実行すると、後で強制終了する必要があるバックグラウンドプロセスが起動します。したがって、最低限、ハックを次のようなものに変更する必要があります。

eval `ssh-agent -s` 
svn stuff
kill $SSH_AGENT_PID

ただし、このハックがどのように機能しているかわかりません。 ssh-addも実行せずにエージェントを実行するだけでは、キーは読み込まれません。おそらく、MacOSのssh-agentは、その マニュアルページ とは異なる動作をしていると言っています。

21
pra

加えて...

キーにパスフレーズがある場合、キーチェーンは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 からコピーされた回答

30
Mike Hemelberg

私も同様の問題を抱えていました。スクリプト(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がスムーズに実行されるようになりました。

8
bryan kennedy

実行中の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が最後に見つけたものを使用することを前提としています。

6
vpk

私の解決策(praに基づく)は、スクリプトが失敗した場合でもプロセスを強制終了するようにわずかに改善されました。

eval `ssh-agent`
function cleanup {
    /bin/kill $SSH_AGENT_PID
}
trap cleanup EXIT
ssh-add
svn-stuff

自分のマシン(scientific linux 6)でssh-addを呼び出す必要があることに注意してください。

5
Michael Z.

自動化されたパスワード/パスフレーズハックなしで自動化されたプロセスを設定するには、パスフレーズのない別の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
... 
4
Dave X

すでに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

私は個人的にこれのために追加のプログラムを使用することを避けようとしました、しかし私が試みた他のすべてはうまくいきませんでした。そして、これはうまくいきました。

4
Ivan

ここにある他のいくつかの回答(特に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
3
markshep

キーチェーンを使用できない場合、およびスクリプトから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資格情報を使用できるようになるため、マルチユーザー環境では注意して使用してください。

2
gcbenison

ソリューションは機能しますが、他の回答ですでに示されているように、毎回新しいエージェントプロセスが生成されます。

私は同様の問題に直面し、これが blogpost 有用であることに気づきました。また、 github のブログで言及されているWayneWalkerによるシェルスクリプトも同様です。

幸運を!

1
goggelj