PHPはてなからはてブロに移動しましたこの広告は、90日以上更新していないブログに表示しています。PHP?(www.doyouphp.jp)で公開していたコンテンツを移行/加筆/修正したものです。公開の経緯はこちらをどうぞ。初出:2006/01/28PHPを使ってバッチスクリプトなどを作る際、ファイル転送といえば今まではftp経由が主流(?)かと思いますが、昨今のセキュリティに対する意識向上から何らかの暗号化を施したい場合があります。2005年の初めにPECLにssh2拡張モジュールが登録されマニュアルもそれなりにこなれてきましたので、今更ながら試してみました。ssh2今回のゴールは、PHPから公開鍵認証を行い、リモートコマンドの実行とファイル転送を行う、というものです。インストールまずはインストールした環境ですが、OSはCentOS6.4、PHPは以下のようなconfigureオプションを付けたPHP5.6.6です。\--with-readline「--prefix」オプションを付けているため、phpコマンドのパスがデフォルトとは変わっていますが適宜読み替えてください。ssh2拡張モジュールのインストールですが、PHPマニュアルにもあるとおり先にopensslとlibssh2をインストールしておく必要があります。最近のLinuxディストリビューションであれば、openssl-develパッケージなど用意されていると思いますので、aptなりup2dateなりyumなりでインストールした方が簡単です。今回の環境ではyumコマンドで各パッケージをインストールしました。続いて、peclコマンドでssh2拡張モジュールをインストールします。インストールが終わったら、ssh2拡張モジュールをロードするようphp.iniに追記します。:最後にモジュールが正しくロードされている事を確認します。Apache+PHPで利用する場合はApacheを再起動します。認証用の関数を使用して認証となります。認証方法にはパスワード認証と公開鍵認証が利用できます。パスワード認証の例まず、パスワード認証の場合、ssh2_auth_password関数を使用します。公開鍵認証の場合、事前にRSA秘密鍵・公開鍵のペアを作成しておく必要が(当然)あります。Apacheと組み合わせる場合はUserディレクティブで指定したユーザー、バッチの場合はバッチを実行するユーザーでの読み込み権限が必要です。今回は、/home/httpd/.sshディレクトリを作成し、所有者をApacheのUserディレクティブでしていたnobodyユーザーにしました。使用する関数は、ssh2_auth_pubkey_fileです。以下ざっとした手順です。targethostの/etc/ssh/sshd_configの編集が必要になる場合もありますので、適宜Googleで検索してみてください。公開鍵を接続先サーバにコピーしauthorized_keys2を作成しておきます。PHPコードのほうですが、次のような感じになります。PHP_EOL;リモートコマンドの実行例コマンド実行はssh2_exec関数で行いますが、結果出力を取得する場合はssh2_exec関数から返されるストリームのブロックモードを有効にしておく必要があります。4096));ちなみに、ここで返されるストリームはstdoutになります。このため、エラーメッセージなどを取得する場合は、コマンドの後に「2>&1」を付けてstderrと共にstdoutに出力をするか、以下のように一度stderrサブストリームを取得して、結果を取得するようになります。stderrサブストリームを取得する。4096));ファイルの転送例これはPHPマニュアルどおり、コマンド一発で行えます。'転送失敗';}まとめ前から知っていたのですが、試してみるのが今頃になってしまいました。今回試してみて公開鍵認証が問題なく行えると分かりました。これは使いどころによってはかなり強力ではないかと思います。通常、バッチスクリプトならshスクリプトで済ませてしまうことが多いのですが、ちょっと凝ったことをするバッチなどに良いかも知れません。erro...またやってしまった。/usr/lo...タイトル長くてすみません。Professionalが到着!月別アーカイブはてなブログをはじめよう!shimookaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。