Mac OS X の cron で SSH に失敗する.
問題
cron で定期的にサーバに ssh して何かコマンドを実行したいという時があると思いますが,そのまま設定すると失敗します.公開鍵を正しく設定していても Permission denied と怒られます.
Permission denied (publickey,keyboard-interactive).
原因と解決策
これは cron の実行時に ssh-agent の環境変数 SSH_AUTH_SOCK が設定されていないのが原因で,この値を crontab に設定してあげるとうまくいきます.
% env | grep SSH_AUTH_SOCK SSH_AUTH_SOCK=/tmp/launch-gLshX6/Listeners
# crontab SSH_AUTH_SOCK=/tmp/launch-gLshX6/Listeners 0 * * * * /usr/bin/ssh ...
debug1: Authentication succeeded (publickey).
うまくいきました.
SSH_AUTH_SOCKの自動設定
2010/10/11 追記
SSH_AUTH_SOCK はログインするたびに変わってしまうのでハードコーディングしてしまうと動かない.crontab から呼び出されるスクリプト内にこの値を取得して環境変数に設定するコマンドを書けば良い.
#!/bin/sh export SSH_AUTH_SOCK=`ls /tmp/launch-*/Listeners`
参考: http://discussions.apple.com/thread.jspa?threadID=1674891