背景
在Python中做遠程SSH操作是很方便的,有很多的模塊如paramiko、fabric,甚至是ansible、salt,但目前公司使用PHP來開發監控,實現基於logstash的日誌監控,需要對客戶端進行一些shell操作,初次實現時使用PHP調用python腳本的方法實現logstash的初始化和狀態驗證,但一直不太穩定,而且這種方式很蹩腳,讓人很不爽,所以找時間研究了一下PHP中的ssh遠程執行命令的方法,發現有類似paramiko的ssh2擴展可以使用。
安裝
PHP擴展安裝有三種主要方法:編譯安裝、pecl、composer
分別對應python中的編譯安裝、easy_install、pip,但總體的體驗來說,composer比pip還是差不少,必須吐槽一下
具體安裝方法參考:安裝php ssh2擴展
使用演示
1. 新建ssh2連接
$conn = ssh2_connect($ip,$port); //初始化連接
$pubkey = APP_PATH . 'public/shell/pub_key'; //這裏的公鑰對不是必須爲當前用戶的
$prikey = APP_PATH . 'public/shell/pri_key';
$res = ssh2_auth_pubkey_file($conn, $user, $pubkey, $prikey); //基於rsa祕鑰進行驗證
//如果使用密碼需要使用另一個人函數ssh2_auth_password
2. 執行shell命令
$stream = ssh2_exec($conn, 'service logstash status'); //執行結果以流的形式返回
$dio_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO); //獲得標準輸入輸出留
$err_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR); //獲得錯誤輸出留
stream_set_blocking($err_stream, true);
stream_set_blocking($dio_stream, true);
$result_err = stream_get_contents($err_stream);
$result_dio = stream_get_contents($dio_stream); //獲取流的內容,即命令的返回內容
fclose($stream);
3. 遠程傳輸文件
$filename = 'logstash-' . $id . '.conf';
$src = APP_PATH . 'public/logconfig/' . $filename; //本地文件
$dst = '/etc/logstash/conf.d/' . $filename; //遠程目錄地址
if (file_exists($src)) {
$flag = ssh2_scp_send($conn, $src, $dst, 0644); //默認權限爲0644,返回爲bool
if ($flag) {
......
}
}
4. 其它相關功能
除了上述演示的幾個核心功能外,ssh2擴展也可以實現sftp、交互式shell、tunnel等功能,詳細請參考PHP在線手冊