ブログを置いているサーバを操作する時にsshを使っており、セキュリティの面や毎回パスワードを入れずに済むという理由から秘密鍵を使ってssh接続していました。ちょっと前から、なぜか毎回パスワードを聞かれるようになってしまったのでその解決方法をメモしておきます。

macOS Sierra で、 ssh のときの秘密鍵パスワードがキーチェインに保存さなくなったときの対策

原因は、macOS を Sierraにアップグレードしたことのようです。それにより、sshのバージョンが変わったのが直接の原因らしいです。

[Mac OS X] macOS Sierra にしたら ssh の度にパスフレーズを求められる問題の解決方法

mac os x sierra で ssh の鍵のパスワードがキーチェインに保存されない対策

上記を参考に対策しました。

***

sudo vim /etc/ssh/ssh_config で、ファイルに

UseKeychain yes

の1行を追記していちおう再起動。

これで、一度秘密鍵のパスワードを入力すれば、その後はパスワード無しでssh接続できる

cronでssh接続すると、未だにパスワードを聞かれる問題の解決

サーバ上のデータをgitで定期的にバックアップを取れるよう、cronでgit pullを動かす環境を構築していました。
今回の問題で、cronで動かすsshもパスワードを聞かれて自動で動かない問題が発生していたのですが、前述した方法でもこちらの問題は解決できていませんでした。

cron_git_pull.shという、cronで呼び出すためのシェルスクリプトを用意してあります。中身は、複数のgitのディレクトリでsshの接続でgit pullをするというものです。
bash cron_git_pull.sh
と手動でコマンドで動かすと問題なくパスワード無しで動きます。cronで動かした場合だけ未だにパスワードを聞かれて動かなくなったという状況です。

Mac OS X の cron で SSH に失敗する.
上記の解決策を試そうと思ったら、既に同様の記述がcron_git_pull.shに入っていました。


#!/bin/sh
export SSH_AUTH_SOCK=`ls /tmp/com.apple.launchd.*/Listeners`

なので、原因はこれではない模様。

cron上でのコマンド実行を再現する
それ以外の原因を探るために、上記のやり方でスクリプトを実行してみました。
env - ./cron_git_pull.sh
すると、Permission deniedで実行不可に
スクリプトの実行権限が良くないようだったので
chmod 755 cron_git_pull.sh
で実行可能にする。
その後、実行してみると、問題なく実行できました。

cronのほうでも、crontab -e ですぐに実行されるように試してみると、こちらでも問題なく実行できた。
ということで、スクリプトの実行権限が問題だったようです。
OSのアップグレード前は、同じスクリプトファイルで問題なく動いていたので、これもOSをSierraにアップグレードして、sshのバージョンが変わったことが要因だったのでしょう。



追記
自分がパソコンで作業をしている間はcronのsshもちゃんと動いていたけれど、使っていない間のcronでは依然として Permission denied で実行不可能でした。
問題は、操作していない時の自動スリープと自動ログアウト。

システム環境設定>省エネルギー から自動スリープをさせ無くして、

システム環境設定>セキュリティとプライバシー から、「スリープとスクリーンセーバの解除にパスワードを要求」のチェックを外す。

これで、操作していないときでもcronが問題なく動きました。
セキュリティ的には怪しいですが、家に置きっぱなしのパソコンなのでさほど問題ないでしょう。