php リモート コピーしてコマンドを実行
php リモートコピーと実行コマンド
php がリモートでファイルをコピーし、リモートサーバーでコマンドを実行する場合、使用されるモジュールはすべて ssh2 接続ハンドルに基づいて完了します。
wget http://www.libssh2.org/download/libssh2-1.4.2.tar.gz tar zxf libssh2-1.4.2.tar.gz cd libssh2-1.4.2 ./configure && make && make install
wget http://pecl.php.net/get/ssh2-0.11.3.tgz cd ssh2-0.11.3 phpize (如果报错命令没有找到,apt-get install php5-dev) ./configure ―with-ssh2 && make && make install
cd /etc/php5/cgi vim php.ini 添加项:extension=/usr/lib/php5/20090626/ssh2.so ssh2.so是编译ssh2时得到的模块,上面是模块的位置。
cd /etc/php5/cli vim php.ini 添加项:extension=/usr/lib/php5/20090626/ssh2.so ssh2.so是编译ssh2时得到的模块,上面是模块的位置。
/etc/init.d/lighttpd restart
[root@localhost ~]php -m | grep ssh2 ssh2
SSH2 に接続するには、ユーザー名とパスワード、および ssh キー形式の 2 つの方法があります。
$connection = ssh2_connect("192.168.6.222",22); if (ssh2_auth_password($connection,"veno","ubuntu")) { echo "Authentication Successful! "; }else{ die("Authentication Failed..."); }
$connection = ssh2_connect('192.168.6.222', 22, array('hostkey'=>'ssh-rsa')); if (ssh2_auth_pubkey_file($connection, 'root', '/root/.ssh/id_rsa.pub', '/root/.ssh/id_rsa')) { echo "Public Key Authentication Successful\n"; } else { echo ('Public Key Authentication Failed'); }
追伸: 鍵の生成:
サーバー 192.168.6.229
に root としてログインします。
#ssh-keygen
ご質問がある場合は、Enter キーを押してください
結果の公開鍵は ~/.ssh/id_rsa.pub にあります
229 での鍵検証を通じて 222 にログインしたい場合は、229 の公開鍵 id_rsa.pub を 222 に設定し、まず手動で root にログインしてから、次のコマンドを実行します。
cat id_rsa.pub >> ~/.ssh/authorized_keys
このようにして、229 で 192.168.6.229 に ssh 接続し、パスワードを入力せずに 222 にログインできます。上記の php コードは 229 の検証にも合格できます。
SSH2 検証に合格した後、取得された接続文字は $connection
ですリモートサーバーファイルをローカルにコピーします:
bool ssh2_scp_recv ( resource $session, string $remote_file, string $local_file )
追記: ファイルを受信するときは、次のようなファイル名を空にすることができます:
ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/')
ローカル ファイルをリモート サーバーにコピーします
bool ssh2_scp_send ( resource $session, string $local_file, string $remote_file [, int $create_mode] )
追記: ファイルを送信する場合、次のようなファイル名を空にすることはできません:
ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');
resource ssh2_exec( resource $session, string $command [, string $pty [, array $env [, int $width [ , int $height [, int $width_height_type]]]] )
222 と 229 でコマンドを実行します:
$tcmd="cd /home/veno/gateway/radiusclient;"; $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d"; $stream = ssh2_exec($connection, $tcmd); stream_set_blocking($stream,true); echo stream_get_contents($stream);
<?php echo "是访问到这里来了"; $connection = ssh2_connect('192.168.6.222', 22, array('hostkey'=>'ssh-rsa')); if (ssh2_auth_pubkey_file($connection, 'root', '/root/.ssh/id_rsa.pub', '/root/.ssh/id_rsa')) { echo "Public Key Authentication Successful\n"; //$flag=ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/'); //接收时,后面文件名可以为空 //$flag=ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml'); //发送时,后面的文件名不能为空 //echo $flag; $tcmd="cd /home/veno/gateway/radiusclient;"; $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d"; $stream = ssh2_exec($connection, $tcmd); stream_set_blocking($stream,true); echo stream_get_contents($stream); } else { echo ('Public Key Authentication Failed'); } echo "<br/>"; $connection = ssh2_connect('192.168.6.222', 22); ssh2_auth_password($connection, 'veno', '*******'); $tcmd="cd /home/veno/gateway/radiusclient;"; $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d"; $stream = ssh2_exec($connection, $tcmd); echo "<br/>"; echo "-----------------------------------------------"; stream_set_blocking($stream,true); echo stream_get_contents($stream); echo "-----------------------------------------------"; echo "<br/>";