php遠程copy文件以及在遠程服務器中執行命令時,所用到的模塊是ssh2,以后所有的操作都依據ssh2連接句柄完成。
libssh: https://www.libssh2.org/
ssh2: https://pecl.php.net/package/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 https://pecl.php.net/get/ssh2-1.1.2.tgz cd ssh2-0.11.3 phpize ./configure —with-ssh2 && make && make install
ubuntu安裝:
apt-get install libssh2-1-dev libssh2-php 會直接安裝, 不需要修改PHP配置信息
[修改配置文件]
cd /etc/php5/cli vim php.ini 添加項:extension=/usr/lib/php5/20090626/ssh2.so ssh2.so是編譯ssh2時得到的模塊,上面是模塊的位置。
查看是否加載了ssh2
php -m|grep ssh2
ssh2
[使用]
SSH2連接有兩種方式,分別是用戶名密碼,ssh密鑰形式。
1.用戶名和密碼
$connection = ssh2_connect("192.168.6.222",22); if (ssh2_auth_password($connection,"veno","ubuntu")) { echo "Authentication Successful! "; }else{ die("Authentication Failed..."); }
2.ssh密鑰
v$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'); }
密鑰生成方式:
ssh-keygen -t rsa 生成后的公鑰: ~/.ssh/id_rsa.pub 然后使用ssh-copy-id的方式添加到需要免密登錄的服務器上
3.遠程copy文件
遠程服務器文件copy到本地:
bool ssh2_scp_recv ( resource $session, string $remote_file, string $local_file )
Ps: 接收文件時,后面文件名可以為空,如:
ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/')
本地文件copy到遠程服務器
bool ssh2_scp_send ( resource $session, string $local_file, string $remote_file [, int $create_mode] )
Ps:發送文件時,后面的文件名不能為空,如:
ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');
4.執行遠程服務器上的命令並取返回值
resource ssh2_exec( resource $session, string $command [, string $pty [, array $env [, int $width [, int $height [, int $width_height_type]]]]] )
在229上面執行222上的命令具體實例:
$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); ssh2_exec() 是會有返回值的,而它的返回值是無格式的(無換行),但它是以stream(流的形式返回), 顯示出來,可這樣進行流處理: stream_set_blocking($stream, true); echo :stream_get_contents($stream);
DEMO:
<?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/>";