php实现ssh远程连接服务器并操作服务器, 需要用到php_ssh扩展包
安装
解决依赖关系如下:PECL/ssh2 –> libssh2 –> openssl
- 下载libssh2和ssh2, 地址分别为:
http://www.libssh2.org/download/
http://pecl.php.net/package/ssh2
这里我们可以均下载最新版本,libssh2的源码包为libssh2-1.6.0.tar.gz,ssh2的源码包为ssh2-0.12.tgz。
具体地址:
https://www.libssh2.org/download/libssh2-1.6.0.tar.gz
http://pecl.php.net/get/ssh2-0.12.tgz
- 解压并安装libssh2和ssh2。其中,libssh2需要先安装,ssh2后安装。安装步骤如下:
# tar -zxvf libssh2-1.4.2.tar.gz
# cd libssh2-1.4.2
# ./configure --prefix=/usr/local/libssh2
# make && make install
以上为安装libssh2,这里需要记住libssh2的安装目录,因为在安装ssh2的时候还会用到。
# tar -zxvf ssh2-0.12.tgz
# cd ssh2-0.12
# phpize
# ./configure --prefix=/usr/local/ssh2 --with-ssh2=/usr/local/libssh2
# make
执行完以上过程后,在当前目录下的modules目录下会生成一个ssh2.so文件,这就是扩展PHP所需要的,将该文件拷贝到PHP库的存储目录下在修改PHP的配置文件即可。
# cp modules/ssh2.so /usr/lib64/php/modules/
注:PHP库的存储目录可能因系统而异,我的在 /usr/lib64/php/modules/
# vi /etc/php.ini
向该文件中添加内容:
extension=ssh2.so
可能遇到的问题和解决方案:
configure: error: OpenSSL Crypto library not found
或
configure: error: No crypto library found!
crypto是什么呢? 是OpenSSL 加密库(lib), 这个库需要 openssl-devel
包
在ubuntu中就是 libssl-dev
RedHat Fedora 平台
yum -y install openssl-devel
Debian ,ubunu 平台
apt-get install libssl-dev
验证是否安装成功
只需要输入:
php -m
查看列表中是否有 ssh2
即可
使用
<?php
$user="user";
$pass="password";
$connection=ssh2_connect('202.112.113.250',22);
ssh2_auth_password($connection,$user,$pass);
// 查看家目录的命令
$cmd="ls ~";
$ret=ssh2_exec($connection,$cmd);
stream_set_blocking($ret, true);
echo (stream_get_contents($ret));
?>
为了使用方便, 封装了一个类如下:
<?php
namespace App\Lib;
class FizzSSH
{
public static $config = [
'host' => '127.0.0.1',
'port' => '22',
'username' => 'root',
'password' => '123456'
];
/**
* 执行操作
* @param string $cmd 执行的命令
* @param array $config 连接配置文件, 具体参考上边的 $config 公共变量
* @return mixed
*/
public static function run($cmd='', $config=[])
{
if (empty($config)) {
$config = static::$config;
}
// 连接服务器
$connection=ssh2_connect($config['host'], $config['port']);
// 身份验证
ssh2_auth_password($connection, $config['username'], $config['password']);
// 执行命令
$ret=ssh2_exec($connection, $cmd);
// 获取结果
stream_set_blocking($ret, true);
// 返回结果
return stream_get_contents($ret);
}
}
使用方法:
use FizzSSH;
$cmd = "mkdir -p /var/www/soft && echo 'test'>>/var/www/soft/test.txt && cat /var/www/soft/test.txt";
FizzSSH::run($cmd, $config);
完美手工~~~
网友评论