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在线手册

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