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を使うのがベターっぽい。