本文目的
花了一下午時間,終於弄清楚了如何在php中使用libssh2擴展。在這個過程中遇到了一些問題,在解決問題的過程中加深了對php和ssh2的理解。所以,還是決定抽點時間回顧整個過程,作為備忘。
什么是php的ssh2擴展
Php ssh2擴(以下簡稱PECL/ssh2),允許在php程序中遠程執行系統命令和文件傳輸,不需要在被監控的機器上單獨開發和部署類似agnet的“木馬”程序,大大降低了運維成本。
Php ssh2擴展需要的依賴庫
- openssl: 加密算法集合,C語言實現
- libssh2:ssh2協議庫庫,C語言實現
- PECL/ssh2: libssh2的php擴展,允許php程序調用libssh2中的函數
依賴關系:PECL/ssh2 –> libssh2 –> openssl
安裝過程
[openssl]
$ cd openssl.x.x.x $ ./configure --prefix=/your/openssl/home $ make $ make install |
[libssh2]
$ cd libsshxxxx $ ./configure --with-libssl-prefix=/your/openssl/home LIBS=-ldl $ make $ make install |
PS: 配置中的“LIBS=-ldl”十分重要,如果不設置,如果不設置會導致“dlclose無法鏈接等錯誤”
[PECL/ssh2]
$ cd ssh2x.x.x $ phpize $ ./configure --with-php-config=/your/php/home/bin/php-config LIBS =-ldl $ make $ make install $ vi php.ini (添加extension=ssh2.so) $ cp ssh2.so /php.ini/extention_dir $ cd /apache/bin $ apachectl restart (重啟apache,使ssh2擴展生效) $ php –I | grep ssh2 (檢查PECL/ssh2是否安裝成功,什么都沒有標識沒有成功) |
PS: 配置中的“LIBS=-ldl”十分重要,如果不設置,會導致“libssh2 version >= 0.4 not found”錯誤,可以通過查看config.log,定位具體的bug位置,與安裝libssh類似。
Php ssh2 API例子
通過PECL/ssh2相關API遠程操作計算機時,首先需要獲取鏈接,使用函數:
session ssh2_connect($host, $port) |
獲取鏈接后,需要進行驗證,也就是登錄,ssh2提供三種登入方式:
- public key : 通過公鑰和密鑰進行驗證,需要使用openssl生成工密鑰,然后將公鑰上傳到需要遠程訪問機器的指定目錄。特點比較安全,但是不太方便。PECL/ssh2支持。
- password : 直接通過用戶名和密碼登錄。特點是很方便,但是不安全,密碼必須已明文的方式傳給ssh2的api。PECL/ssh2支持。
- keyboard-interactive:需要用戶手動輸入密碼,PECL/ssh2不支持。
可以通過下面的api獲取服務器提供的驗證方式:
mixed ssh2_auth_none ( resource $session , string $username ) |
返回值是一個驗證方式的字符串數組。
下面的代碼演示password方式驗證並在遠程調用”pwd”命令:
<?php $host='ip_or_host'; $user='some_user'; $passwd='your_password'; // 鏈接遠程服務器 $connection = ssh2_connect($host, 36000); if (!$connection) die('connection to '.$host.':3600 failed'); echo 'connection OK<br/>'; // 獲取驗證方式並打印 $auth_methods = ssh2_auth_none($connection, $user); print_r( $auth_methods.'<br/>'); if (in_array('password', $auth_methods )) { // 通過password方式登錄遠程服務器 if (ssh2_auth_password($connection, $user, $passwd)) { echo $user.' login OK<br/>'; $stream = ssh2_exec($connection, "pwd"); // 執行php stream_set_blocking($stream, true); // 獲取執行pwd后的內容 if ($stream === FALSE) die("pwd failed"); echo 'pwd: '.stream_get_contents($stream).'<br/>'; } else { die( $user.' login Failed<br/>'); } } ?>
總結
安裝php擴展的一般過程:
1. phpize,生成配置文件和makefile等
2. ./configure && make && make install
3. 邊界php.ini,添加extension
4. 將編譯的so文件考到extension_dir目錄下
5. 重啟apche
6. 查看phpinfo或“php –i| grep xxxx”輸出的頁面中是否存需要安裝的擴展
PS: 配置過程中,如果發現一些問題,可以通過查看config.log查看問題發生位置。
參考資料
- Php ssh2 api官方文檔,很清晰,注意下面的討論:http://www.php.net/manual/en/ref.ssh2.php
- 安裝步驟描述:http://www.cnblogs.com/edwardlost/archive/2011/04/02/2003097.html