php遠程copy文件以及在遠程服務器中執行命令時,所用到的模塊是ssh2,以後所有的操作都依據ssh2連接句柄完成。
1. SSH2模塊的安裝
1.1 安裝需要的擴展包
[plain]
wget
tar zxf libssh2-1.4.2.tar.gz
cd libssh2-1.4.2
./configure && make && make install
wget
tar zxf libssh2-1.4.2.tar.gz
cd libssh2-1.4.2
./configure && make && make install
[plain]
wget
cd ssh2-0.11.3
phpize (如果報錯命令沒有找到,apt-get install php5-dev)
./configure —with-ssh2 && make && make install
wget
cd ssh2-0.11.3
phpize (如果報錯命令沒有找到,apt-get install php5-dev)
./configure —with-ssh2 && make && make install
1.2 修改php配置信息
[plain]
cd /etc/php5/cgi
vim php.ini
添加項:extension=/usr/lib/php5/20090626/ssh2.so
ssh2.so是編譯ssh2時得到的模塊,上面是模塊的位置。
cd /etc/php5/cgi
vim php.ini
添加項:extension=/usr/lib/php5/20090626/ssh2.so
ssh2.so是編譯ssh2時得到的模塊,上面是模塊的位置。
[plain]
cd /etc/php5/cli
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時得到的模塊,上面是模塊的位置。
1.3 重啟web服務器
[plain]
/etc/init.d/lighttpd restart
/etc/init.d/lighttpd restart
1.4 查看是否加載了ssh2
[plain]
[root@localhost ~]php -m | grep ssh2
ssh2
[root@localhost ~]php -m | grep ssh2
ssh22. SSH2模塊的連接應用
SSH2連接有兩種方式,分別是用戶名密碼,ssh密鑰形式。
2.1 用戶名與密碼
[php]
$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);
if (ssh2_auth_password($connection,"veno","ubuntu"))
{
echo "Authentication Successful! ";
}else{
die("Authentication Failed...");
}
2.2 ssh密鑰
[php]
$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');
}
$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');
}
Ps: 密鑰生成:
在服務器192.168.6.229上面以root登錄
[plain]
#ssh-keygen
#ssh-keygen
有什麼提問基本上回車即可
後成的公鑰在~/.ssh/id_rsa.pub
如果想在229通過密鑰驗證登錄到222上面,則把229的公鑰id_rsa.pub cp到222上面,先手動登錄root,然後運行:
[plain]
cat id_rsa.pub >> ~/.ssh/authorized_keys
cat id_rsa.pub >> ~/.ssh/authorized_keys
這樣就可以在229上面ssh 192.168.6.229不需要輸入密碼即可登錄到222。上面php代碼在229上面也可以通過驗證。
3. SSH2模塊的具體應用
通過SSH2驗證通過後,得到的連接符為$connection
3.1 實現遠程copy文件
遠程服務器文件copy到本地:
bool ssh2_scp_recv ( resource $session, string $remote_file, string $local_file )
Ps: 接收文件時,後面文件名可以為空,如:
[php]
ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/')
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:發送文件時,後面的文件名不能為空,如:
[php]
ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');
ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');
3.2 執行遠程服務器上的命令並取返回值
resource ssh2_exec( resource $session, string $command [, string $pty [, array $env [, int $width [, int $height [, int $width_height_type]]]]] )
在229上面執行222上的命令具體實例:
[php]
$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);
$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代碼
[php]
<?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/>";
<?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/>";