MacOSXで、Homebrewから入れたopensshを使う

MacOSXには、標準でsshが入ってるし、別にそれを使ってても何も支障はないんだけど、なんとなくhomebrewでいれた最新版を使いたいなーなんて思ったのが運の尽きで、ちょっと問題が起きたのでそれをメモ。ついでに、一緒に入ってくるsshdでサーバーを建てる方法もゴニョゴニョ。

OpenSSHを入れる

Homebrewでopensshを入れるのは簡単で、次のようにコマンドを打てばいい

$ brew tap homebrew/dupes #過去に一度やっているようなら不要
$ brew install openssh
確認
$ ssh -v #OpenSSH_6.2
$ /usr/bin/ssh -v #OpenSSH_5.9
$ /usr/local/bin/ssh -v #OpenSSH_6.2

問題

この状態で、別のMacsshdに接続すると、lsで日本語が化ける。全部??????になる。こっちが????だコンチクショー!

んで、その解決方法は、まぁ"diff /etc/ssh_config /usr/local/etc/ssh/ssh_config" をすれば分かるんだけど、homebrew版ssh_configを下記のように修正すればいい。

- #Host *
+ Host *
+ SendEnv LANG LC_*

Homebrew版sshdを使う

ところが、こんな簡単な問題だとは気づかず、「あ、Mac標準のsshdとHomebrewなsshの相性が悪いに違いない!どちらもHomebrew版にすれば、解決するに違いない!」と思った俺は、そそくさとサーバー側にもHomebrew版のopensshを入れ、ゴニョゴニョし始めるわけである。

確認
$ sshd -v #OpenSSH_6.2
$ /usr/sbin/sshd -v #OpenSSH_5.9
$ /usr/local/sbin/sshd -v #OpenSSH_6.2

$ telnet localhost 22 #SSH-2.0-OpenSSH_5.9
既存のsshdを切る

とりあえず、今動いてるsshdを切る。今まで、Mac標準のsshdを使っていたので、機能のOFFは「システム環境設定」の「共有」を開き、リモートログインのチェックボックスをOFFにした。コマンド派な人は下記のコマンドを打つだけでもいいはず。(システム環境設定の共有とlaunchctlがリンクしてるかどうかは、まだ良くわかってない)

$ sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist
設定を書き換える

上記のコマンドで参照してるファイル「/System/Library/LaunchDaemons/ssh.plist」がデーモン起動用の設定ファイルになるので、これを書き換える。
基本的に、value(とかとか)とがペアになって交互に並んでいる設定ファイルである。そこの「Program」の値「/usr/libexec/sshd-keygen-wrapper」となっているところを「/usr/local/sbin/sshd」に書き換え、「ProgramArguments」のの第1項を「/usr/sbin/sshd」から「/usr/local/sbin/sshd」に書き換える。

起動

下記コマンドを打って、デーモンとして立ち上げる。

$ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
確認

下記コマンドを打って、OpenSSHが6.2になっていれば勝ち

$ telnet localhost 22 #SSH-2.0-OpenSSH_6.2
注意

sshdをHomebrew版にしたら、ちゃんと設定を見直そう。というのも、標準のsshdなら /etc/sshd_config を参照するのだが、Homebrew版は /usr/local/etc/ssh/sshd_config が参照する。 Homebrew版の方に旧設定ファイルを上書きするもよし(?)、diffとってチマチマ直すもよし、とりあえずこの設定を見なおさないと、passwordAuthentication が yes になってたりする(コメントアウトされてるが、おそらく無記述によるデフォルト値がyes)ので注意が必要。

余談

ssh.plistを書き換えた時、Programの値を書き換えたが、実はこの「/usr/libexec/sshd-keygen-wrapper」は、単なるshellファイルで、起動時にssh_host_keyとかがなかったら生成してくれるコマンドを含んでいるものなので、本来ならProgramの値を書き換えるのではなく、「/usr/libexec/sshd-keygen-wrapper」の中に書かれているsshdのパスを書き換えるべきなんじゃないかなー、なんて思ったり思わなかったり。