phpからsshでコマンドを実行する方法

例えばweb上でapacheのユーザーから別のユーザーにスイッチして作業したいケースで、phpからsshを使う方法。

まずshで問題ないことを確認する(StrictHostKeyChecking no → 確認メッセージを表示しない)。何も考えず以下を実行してみる。

ssh -l user -p 10022 -o 'StrictHostKeyChecking no' localhost touch test

以下のエラーが出る

Permission denied (publickey,gssapi-with-mic).

→ 鍵認証にしているため、秘密鍵と公開鍵を作成しないといけなかった

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
// 以下のフォルダでよければそのままエンター
Enter file in which to save the key (/home/user/.ssh/id_rsa):
// パスフレーズは設定しないのでそのままエンター
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
// 秘密鍵と公開鍵が作成される
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.

※ポイントはパスフレーズなしの認証鍵を作成すること。

公開鍵をapacheユーザーのknown_hostsに登録
/etc/passwdでホームディレクトリを確認

apache:x:48:48:Apache:/var/www:/sbin/nologin

以下実行

mkdir /var/www/.ssh
chmod 777 /var/www/.ssh
cd /var/www/.ssh
cat /home/user/.ssh/id_rsa.pub >> known_hosts
chown apache. known_hosts

秘密鍵はひとまず共有ディレクトリに設置

mkdir /usr/share/key/
cp /home/user/.ssh/id_rsa /usr/share/key/
chmod 600 /usr/share/key/id_rsa
chown apache. /usr/share/key/id_rsa

秘密鍵はデフォルトで~/.ssh/id_rsaを読みに行く。別の場所を指定する場合-iオプションを指定する

ssh -l user -p 10022 -o 'StrictHostKeyChecking no' -i /usr/share/key/id_rsa localhost touch test

これでphpからapacheユーザーでsshを実行してuserとしてtouchコマンドを実行できる。/var/log/secureと/etc/httpd/logs/error_logに問題がないこと。

鍵認証ではなくパスワード認証の場合
パスワードが必要な場合、execコマンドでは無理ぽいので、peclのssh2を使うのがベターっぽい。