SSH はオンライン パケットを暗号化する技術を使用してデータを転送することができ、たとえ誰かがデータを傍受したとしても、送信されるデータはすべて暗号化されます。同時にデータが圧縮されるため、通信速度が大幅に高速化されます。つまり、SSH を使用すると、データ送信を比較的安全かつ効率的に行うことができます。
ただし、PHP が SSH に接続してリモート コマンドを実行できることは誰もが知っているわけではありませんが、非常に便利です。 PHP はさまざまな方法で活用できるため、その動作を制御するための設定オプションが多数あります。多数のオプション パラメータのセットにより、PHP をさまざまな目的に使用できるようになりますが、これらのパラメータとサーバー側の設定の組み合わせによってセキュリティ上の問題が発生する可能性があることも意味します。筆者は PHP CLI アプリケーションで SSH を使用していましたが、最初はそれほど簡単ではなかったと言えます。 Shell2 関数の安全な使用に関するマニュアルは、あまり実用的ではありません。この小さな記事を作成する前に、著者は多くの実験を行ってきました。これを読んで、PHP の設定にかかる時間を少しでも節約できることを願っています。
この記事では、実行しているオペレーティング システムが Debian/Ubuntu であること
を前提としています
。Debian/Ubuntu を実行していない場合は、この記事の対応する内容を Linux ディストリビューションが提供するパッケージ マネージャーに置き換える必要がある場合があります。
PHP5 を実行している場合は、代わりに PHP4 を使用できます。
PHP とサーバー管理の基本を理解していること。
PHP はすでにインストールされています。
前提条件
インストール パッケージ
まず、次のパッケージをインストールしましょう:
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential
openssl-dev zlib1g-dev
インストールは完了し、次のステップに進みます。
libssh2 をコンパイルする
SourceForge Web サイトから Libssh2 をダウンロードした後、それをコンパイルする必要がありますが、心配する必要はありません。次のようにするだけです。
cd /usr/src
wget
// ポート 22 のserver1.example.com にログインします
。 ( !($con = ssh2_connect("server1.example.com", 22))){
echo "失敗: 接続を確立できませんn"
} else {
// ユーザー名 root、パスワード Secretpassword で認証を試みます
if(! ssh2_auth_password ($con, "root", "secretpassword")) {
echo "失敗: 認証できませんn";
} else {
// よし、ログインしました
...n" ;
// コマンドを実行する
if(!($stream = ssh2_exec($con, "ls -al" )) ){
echo "失敗: コマンドを実行できませんn"
} else{
// コマンドから返されたデータを収集します
stream_set_blocking ( $stream, true );
$data = "";
while
( $buf = fread($stream,4096) ){
$data .= $
buf
}
}
2 番目の方法: シェル
同様に、次のコードの関数またはクラスを作成することもできます。ただし、この記事では基本的な概念のみを説明します。
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn'texistent")
// ポート 22 の server1.example.com にログイン
if(!($con = ssh2_connect ("server1.example.com", 22))){
echo "失敗: 接続を確立できませんn";
} else {
// ユーザー名 root、パスワード Secretpassword で認証を試みます
if(!ssh2_auth_password($con, "root ", "secretpassword")) {
echo "失敗: 認証できませんn";
} else {
// 無事、ログインしました
...
n";
シェル
if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo "失敗: シェルを確立できませんn"
} else{
stream_set_blocking( $shell, true ); ;
/ / コマンドを送信します
fwrite($shell,"ls -aln")
;
// & 返されるデータを収集します
$data = ""
while( $buf = fread($shell,,4096) ){
$data .= $buf;
}
fclose($shell);
}
}
}
ヒント:
サーバーがビジーであるか、接続エラーが発生し、バッファーにデータがない場合、PHP スクリプトは出力を停止します。データを収集するためのコマンド (コマンドが完了していない場合でも!)。これには次の操作を行うことができます:
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
ここで、バッファを常にチェックしているループで、COMMAND_FINISHED を見てください。なぜなら、すべてのデータを持っていることがわかるからです。無限ループ (無限ループ) を避けるために、10 秒のタイムアウト制限を使用できます。
$time_start = time()
$data = "";
while( true ){
$data .= fread($stream, 4096) ;
if( strpos($data,"__COMMAND_FINISHED__") !== false){
echo "正常: コマンドが終了しましたn"
;
if
( (time()-$time_start) > 10 ){
echo "失敗: タイムアウト10 秒に達しましたn";
Break;
}
}
上記の例では、stream_set_blocking を false に設定することをお勧めします。
SSH 経由でファイルを送信する
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644);
正しく動作しない場合は、
次の点を確認してください。
この記事に従ってすべての手順を確認してください。
サーバー側では
、sshd_config で「PasswordAuthentication yes」を有効にする必要があります。ほとんどのサーバーのデフォルト値は [yes] ですが、場合によっては、この機能を自分で有効にするには次の行をファイルに追加する必要がある場合があります:
/etc/ssh/sshd_config:
# トンネル化されたクリア テキスト パスワードを有効にするには、yes に変更します
。
変更を加えた場合は、SSH を再起動する必要があります:
/etc/init.d/ssh restart