PHP ssh2實現遠程執行操作

背景

在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在線手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章