php遠程copy以及執行命令
php遠程copy文件以及在遠程服務器中執行命令時,所用到的模塊是ssh2,以後所有的操作都依據ssh2連接句柄完成。
1.1 安裝需要的擴展包
- 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
Ubuntu下可以直接安裝:
apt-get install libssh2-1-dev libssh2-php
1.登入遠程主機:
localhost$ ssh -l jsmith remotehost
2.已連接遠程主機:
remotehost$
3.要臨時回到本地主機,輸入退出符號:“~”與“Control-Z”組合。
當你輸入“~”你不會立即在屏幕上看到,當你按下<Control-Z>並且按回車之後才一起顯示。如下,在遠程主機中以此輸入“~<Control-Z>”
1.2 修改php配置信息
- 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時得到的模塊,上面是模塊的位置。
1.3 重啓web服務器
- /etc/init.d/lighttpd restart
1.4 查看是否加載了ssh2
- [root@localhost ~]php -m | grep ssh2
- ssh2
2. SSH2模塊的連接應用
SSH2連接有兩種方式,分別是用戶名密碼,ssh密鑰形式。
2.1 用戶名與密碼
- $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密鑰
- $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登錄
- #ssh-keygen
有什麼提問基本上回車即可
後成的公鑰在~/.ssh/id_rsa.pub
如果想在229通過密鑰驗證登錄到222上面,則把229的公鑰id_rsa.pub cp到222上面,先手動登錄root,然後運行:
- 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: 接收文件時,後面文件名可以爲空,如:
- 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');
3.2 執行遠程服務器上的命令並取返回值
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);
附件:測試中應用到的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/>";