非常に奇妙な問題がある。 (公開鍵認証を使用して)sshを介してリモートホストでコマンドを実行する小さなbashスクリプトを作成しました。
このスクリプトをコマンドラインから手動で実行すると正常に動作しますが、/ etc/cron.hourlyに配置すると、Permission denied, please try again.
エラーで失敗します。
ssh -i /root/.ssh/id_rsa user@remote "command"
を使用して、スクリプトでキーを明示的に設定しました。echo `id` > /tmp/whoami.log
を追加しました);そしてシステムはUbuntu 12.04サーバーです。リモート側でトラブルシューティングするためのアクセス権はあまりありませんが、前述のように、sshを手動で実行するか、コマンドラインから同じbashスクリプトを実行できます。
なぜこれが起こっているのか、それをどのように修正するのか?
私が間違っていたことが判明し、sshキーwasパスワードで保護されている(キーチェーンがssh-agentをロードしている)ため、スクリプトから失敗したのに、bashセッションから実行したときに失敗しました。スクリプトに. ~/.keychain/$HOSTNAME-sh
を追加すると問題が解決しました(正しい方向に私を示して包括的な回答を提供してくれた@grawityに感謝します)。
インタラクティブコマンドとcronジョブは異なる環境で実行されます。特にインタラクティブセッションでは、SSHエージェントが実行されているか、Kerberos TGTが保存されている可能性があります。ssh
が認証方法を注文する方法できません-i
オプションを追加したという理由だけでキーが使用されていることを確認してください。
SSHエージェントが実行されている場合、ssh
クライアントは常に、明示的に指定されたキーを使用してエージェントキーbeforeを試行します。
ネットワークがKerberosを使用し、Kerberos TGTが存在する場合、OpenSSHはそれを使用しますbefore公開鍵認証を試みます。
私はあなたの環境について何も知りませんが、これらの可能性は両方とも簡単に確認できます。
ssh
コマンドの前にunset SSH_AUTH_SOCK
およびunset KRB5CCNAME
を追加しますthen変更されたスクリプトを手動で実行します。
これにより、スクリプトはエージェントまたはKerberosチケットを参照できなくなり、明示的に指定されたキーのみが使用されます。
ssh
に-v
オプションを追加します。これにより、認証の発生方法の詳細が表示されます。
ssh
コマンドに-oIdentitiesOnly=yes
を追加することもできます。これは 指定されたキーを強制的に使用する になります。
そして、cronからエージェントにアクセスするためのヒントを追加した場合-さらに良い
エージェントは通常、対話型ログインセッションに密接に関連付けられているため、これは一般に推奨されません。特に、ログイン時にのみ開始され、ログアウトすると強制終了されます。SSHキーを実際にロック解除するにはパスワードが必要です(パスワードが保護されている場合)。
「キーチェーン」とおっしゃっていましたが、これはOS Xプログラムですか、それともLinuxスクリプトですか? (Mac OS Xのアーキテクチャについてはあまり知りませんが、私の知る限りmuch cronjobからユーザーのssh-agentにアクセスするのは難しくなっています...)
この問題の別の回避策は、ローカルの絶対パスでファイルまたはコマンドを実行する代わりに、sshコマンドをローカルボックスにsshで設定してsshコマンドを実行することです。これはKRB5CCNAMEをキャッシュし、/ path/commandがキャッシュしない場所で機能します。
# Fails:
0 * * * * /home/user/sshscript.sh
# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh
#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh
ssh-cron を使用すると、SSHキーを公開せずにSSHエージェントを使用して、サーバーを保護するためにスケジュールされたSSH接続を設定できます。