31

リモート マシンに対して 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。ルートとして何かを実行することが悪い/間違っている/などと尋ねたり、文句を言ったり、コメントしたりしないでください-それはこの質問の目的ではありません。

4

5 に答える 5

34

keychain

痛みのない方法でこれを解決します。Debian/Ubuntu のリポジトリにあります。

sudo apt-get install keychain

おそらく他の多くのディストリビューション (Gentoo に由来するようです)。

このプログラムは、何も実行されていない場合に を開始し、現在のシェルをこの特定の に接続ssh-agentできるシェル スクリプトを提供します。sourcessh-agent

の場合bash、 という名前の秘密鍵を使用してid_rsa、以下を に追加します.profile

keychain --nogui id_rsa

これにより、再起動後の最初のログイン時にキーが開始されssh-agent、追加されます。id_rsaキーがパスフレーズで保護されている場合は、パスフレーズも要求されます。保護されていないキーを使用する必要はもうありません! 以降のログインでは、エージェントを認識し、パスフレーズを再度要求することはありません。

また、次を の最後の行として追加します.bashrc

. ~/.keychain/$HOSTNAME-sh

これにより、 によって管理されている SSH エージェントに到達する場所がシェルに通知されkeychainます。.bashrcが から供給されていることを確認してください.profile

ただし、cronジョブはまだこれを認識していないようです。解決策として、crontab実際のコマンドの直前に上記の行を含めます。

* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command
于 2013-08-04T08:22:38.803 に答える
18

通常、ローカルマシンからcrondを実行しているマシンにsshすると、秘密鍵がssh-agentにロードされ、接続を介して転送されると思います。したがって、コマンド ラインからコマンドを実行すると、ssh-agent で秘密鍵が検出され、それを使用してリモート マシンにログインします。

crond がコマンドを実行すると、ssh-agent にアクセスできないため、秘密鍵を使用できません。

crond を実行しているマシンで root の新しい秘密鍵を作成し、その公開部分をauthorized_keyscrond がログインするリモート マシンの適切なファイルにコピーする必要があります。

于 2009-05-15T17:09:31.723 に答える
4

パスフレーズなしで SSH キーを公開しないでください。代わりにssh-cronを使用してください。これにより、SSH エージェントを使用してタスクをスケジュールできます。

于 2016-08-03T17:07:58.993 に答える
-3

昨日、私は同様の問題を抱えていました...

あるサーバーに cron ジョブがあり、ssh を使用して他のサーバーで何らかのアクションを開始します...問題はユーザー権限とキーでした...

私が持っていたcrontabで

* * * * * php /path/to/script/doSomeJob.php

そして、それは単に機能しませんでした(権限がありませんでした)。他のサーバーに接続されている特定のユーザーとしてcronを実行しようとしました

* * * * * user php /path/to/script/doSomeJob.php

しかし、効果はありません。

最後に、スクリプトに移動してからphpファイルを実行すると、うまくいきました..

* * * * * cd /path/to/script/; php doSomeJob.php
于 2013-03-11T16:22:12.277 に答える