コマンドラインから実行するとき、なぜsshはcrontabのが、succedesから失敗しますか?
質問
私は、リモートマシンにSSHを行い、同様に、そこにコマンドを実行bashスクリプトを持っています
ssh -nxv user@remotehost echo "hello world"
私は、コマンドラインからコマンドを実行すると、それが正常に動作しますが、crontabファイルの一部(エラーコード= 255 - SSH接続を確立することはできません)として実行されているとき、それは失敗します。詳細ます:
...
Waiting for server public key.
Received server public key and host key.
Host 'remotehost' is known and matches the XXX host key.
...
Remote: Your host key cannot be verified: unknown or invalid host key.
Server refused our host key.
Trying XXX authentication with key '...'
Server refused our key.
...
私はルートとして機能していますローカルで実行する場合は、、crontabファイルも同様にルートとして動作します。 crontabのコマンドラインから「ID」を実行すると、まったく同じ結果が得られるます:
$ id
> uid=0(root) gid=0(root) groups=0(root),...
私が実行しているマシンcrondにいくつかのローカルマシンからのsshを行います。私は、スクリプトが接続するcrondマシンと他のマシンへのSSHへのSSHキーと資格を持っています。
PS。 /尋ねるルートは/ etc /悪い間違っていると何かを実行すること/コメントを文句を言わないでください - 。それは、この質問の目的ではありません。
解決
私はあなたが実行しているマシンcrondにローカルマシンからsshを正常にするとき、あなたの秘密鍵がssh-agentの中にロードされ、接続を介して転送されることを推測しています。あなたは、コマンドラインからコマンドを実行するときに、それはssh-agentの中で、あなたの秘密鍵を検索し、リモートマシンにログインするためにそれを使用します。
crondコマンドを実行すると、それはssh-agentのへのアクセスを持っていないので、あなたの秘密鍵を使用することはできません。
あなたはcrondを実行しているマシンのルートのための新しい秘密鍵を作成する必要があり、あなたがにログインするcrondたいリモートマシン上で適切なauthorized_keys
ファイルへの公開部分をコピーします。
他のヒント
keychain
の
痛みのない方法でこれを解決します。これは、Debian / Ubuntuのためのリポジトリでいます:
sudo apt-get install keychain
と、おそらく他の多くのディストリビューションのために(それはGentooの由来のように見える)。
このプログラムは、何も実行されていない場合ssh-agent
を開始し、source
dと、この特定のssh-agent
に現在のシェルを接続することができますシェルスクリプトを提供します。
bash
については、id_rsa
という名前の秘密鍵で、あなたの.profile
に以下を追加します:
keychain --nogui id_rsa
このはssh-agent
を起動し、再起動後の最初のログイン時にid_rsa
キーを追加します。キーがパスフレーズで保護されている場合は、それはまた、パスフレーズの入力を求められます。以降のログインのために、もはや保護されていないキーを使用する必要はありません!のを、それが再びパスフレーズを求めるエージェントを認識しません。
また、あなたの.bashrc
の最後の行に以下を追加します
. ~/.keychain/$HOSTNAME-sh
このはkeychain
によって管理SSHエージェントに到達する場所をシェルに知らせます。 .bashrc
は.profile
から供給されていることを確認します。
しかし、それはcron
ジョブがまだこれを見ていないようです。対策として、自分の実際のコマンドの前に、crontab
に上記の行が含まれます:
* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command
パスフレーズなしであなたのSSHキーをさらさないでください。あなたはSSHエージェントを使用してタスクをスケジュールすることを可能にする代わりに、のssh-cronのに、使用します。
だから私は同様の問題がありました。私がここに来て、様々な答えを見ましたが、ここにいくつかの実験で、私はそれがパスフレーズ、ssh-agentのとcronでsshkeysで作業得た方法である。
まず最初に、私のSSH設定は、私のbashのinitスクリプトで次のスクリプトを使用します。
# JFD Added this for ssh
SSH_ENV=$HOME/.ssh/environment
# start the ssh-agent
function start_agent {
echo "Initializing new SSH agent..."
# spawn ssh-agent
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add
}
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
私がログインすると、私はそれが自動的に私を認証するためにssh-agentを使用する上で、その後から、一度、その後、私のパスフレーズを入力します。
ssh-agentの詳細は.ssh / environmentファイルに保存されています。
:ここではそのスクリプトがどのように見えるかですSSH_AUTH_SOCK=/tmp/ssh-v3Tbd2Hjw3n9/agent.2089; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2091; export SSH_AGENT_PID;
#echo Agent pid 2091;
のcronについては、セットアップ、さまざまな方法で正規ユーザーとしての仕事をすることができます。 rootユーザーとしてのcrontab -eを実行した場合には、セットアップrootユーザのcronをでしょう。あなたのように実行した場合のcrontab -uデイビスは、それがユーザーIDデイビスとしてcronジョブを追加します-e。同様に、ユーザーデイビスとして実行され、それがユーザーIDデイビスとして実行するcronジョブを作成します-eのcrontabない場合。これは、次のエントリで確認することができます:
30 * * * * /usr/bin/whoami
これは、ユーザーデイビスにwhoamiは30分ごとの結果を郵送します。 (私は、ユーザーデイビスとしてcrontabeの-eをしました。)
ユーザーデイビスとして使用されているものをキー参照しようとした場合、次の操作を行います。
36 * * * * /usr/bin/ssh-add -l
これが失敗し、メールで送信されたログは言うだろう。
To: davis@xxxx.net
Subject: Cron <davis@hostyyy> /usr/bin/ssh-add -l
Could not open a connection to your authentication agent.
この溶液を上記SSH-エージェントのENVスクリプトを供給することです。ここでは結果のcronエントリーがあります:
55 10 * * * . /home/davis/.ssh/environment; /home/davis/bin/domythingwhichusesgit.sh
これは、10:55でスクリプトを実行します。大手に注意してください。スクリプトインチこれは、.bash initスクリプトであるのと同様、私の環境でこのスクリプトを実行するために述べています。
昨日、私は同様の問題を抱えていた...
私は、1台のサーバー上のcron仕事をしているのsshを使用して、他のサーバー上のいくつかのアクションを開始した...問題は、ユーザー権限で、キー...
crontabの中にI持っていた。
* * * * * php /path/to/script/doSomeJob.php
そして、それは単に動作しませんでした(didntの権限を持っています)。 私は他のサーバに接続されている特定のユーザー、などのcronを実行するようにしようと試みた。
* * * * * user php /path/to/script/doSomeJob.php
しかし、効果なしでます。
最後に、私はスクリプトにnavicate、その後、PHPファイルを実行し、それが働いた..
* * * * * cd /path/to/script/; php doSomeJob.php