Muchonovski got it wrong

なにが なんとも。どれが どうでも。

OSXでphpからリモートホストにrsyncを実行する

ローカルホストからリモートホストに対して,たとえばcrontabなどからrsyncを自動実行するには,そのシェルを実行するユーザのssh秘密鍵/公開鍵を用意して,リモートホスト側の ~/.ssh/Authorization_Keys に公開鍵を設置すればよいのだけど,「ローカル側のphpアプリケーションでフォームのボタンを押したら,特定のファイルを本番サーバに転送する」というような処理をしたい時は,このままではうまくいきません。phpはWebサーバの権限で動作しているので,別途「Webサーバというユーザ」のためのssh秘密鍵/公開鍵を用意して設定する必要があります。

そのへんの設定の仕方はSolarislinux向けにはチョコチョコWeb上に落ちているのだけど,OSXにはほとんど情報がなく,いくつかの点でハマったので,以下に備忘録をメモしておきますよ。

設定のポイント

  • OS X で 標準インストールされているApacheのユーザ名は _www
  • ユーザ _www のhomeディレクトリに相当するのは /Library/WebServer
  • 単にsudo -u _www ssh-keygen ...としても権限不足で蹴られる。

/Library/WebServer/.ssh/を作成する

$ cd /Library/WebServer
$ sudo mkdir .ssh

/Library/WebServer/.sshパーミッションを緩和する

そのままsudoでssh-keygenを実行すると権限不足でssh鍵を書き込めないので,一度~/.sshパーミッションを緩める。

$ sudo chmod 777 .ssh

鍵ペアを生成する

ユーザを _www にしてid_rsaとid_rsa.pubを作成する。

$ sudo -u _www ssh-keygen -t rsa

Enter3回(=デフォルトディレクトリに生成,パスフレーズなし)で /Library/WebServer/.ssh に秘密鍵/公開鍵が生成される。

リモートホストの~/.ssh/Authorization_Keys に登録する

生成された公開鍵 id_rsa.pub の内容をリモートホスト側の~/.ssh/Authorization_Keys に追記する。当該ファイルがあれば最終行にコピペする。なければ,id_rsa.pub を転送してから Authorization_Keys にリネームすればよい。

/known_hostsへ登録する

接続先のリモートホストを/Library/WebServer/.ssh/known_hostsに登録する必要があるので,一度コマンドラインで _www 権限でssh接続してみる。

$ sudo -u _www ssh hoge@192.168.111.111

hogeはリモートホストにログインするユーザ名,後続するのは接続先リモートホストのアドレス。sshがこのホストを/.ssh/known_hostsに登録するか聞いてくるので,'Yes'を入力する。

/Library/WebServer/.sshパーミッション復帰

/Library/WebServer/.sshパーミッションを元に戻す。

$ sudo chmod 755 .ssh

phpからの転送テスト

ここまでの作業が終わると,phpのexecコマンドでこのように書けば,自動でファイル転送が実行できるはず。

exec ("/usr/bin/rsync -avc -e /usr/bin/ssh /test/test.txt hoge@192.168.111.111:/test", $result ) ;

rsyncssh絶対パスで指定することに注意です。おわりー。