楚狐在线 - 资讯杂烩
资讯杂烩   在线工具   益智游戏   影音娱乐   网站导航

通过PHP的SSH2扩展模块执行Linux命令


  通过PHP的SSH2扩展模块执行Linux命令
  PHP连接SSH最正宗、最稳定的方案是使用SSH2扩展。这是由PECL提供的官方原生扩展,直接调用libssh2库,性能和兼容性都非常好。本文以Ubuntu 24.04.3为例进行环境准备和测试。
  1、环境准备
  在使用代码前,请确保你的PHP环境已经安装并启用了ssh2扩展,通过下面的命令查询,若返回ssh2,则环境ok。

php -m | grep ssh2
#返回如下,则为验证OK
ssh2

  否则,则需要部署安装ss2扩展,具体部署安装如下
  # Ubuntu/Debian

sudo apt-get install -y php-ssh2 libssh2-1-dev libssl-dev

  安装完后,在php.ini里面增加扩展配置

extension=ssh2


  重启PHP服务并验证SSH是否ok。

#重启PHP服务
systemctl restart php-fpm
#查询php -m | grep ssh2若报错信息如下,则是扩展文件位置问题,需要找到文件后复制到扩展目录下。
PHP Warning:  PHP Startup: Unable to load dynamic library 'ssh2' (tried: /usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/ssh2 (/usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/ssh2: cannot open shared object file: No such file or directory), /usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/ssh2.so (/usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/ssh2.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
#查询ssh2.so的位置
sudo find / -name "ssh2.so"
#返回如下
/usr/lib/php/20230831/ssh2.so 
#将ssh2.so复制到扩展目录下
cp /usr/lib/php/20230831/ssh2.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/.

  重新验证基本上就ok了,注意:在Debian 13环境下,ssh2.so采用的是PHP 8.4的API编译的,验证的时候会出现下面的错误:

php -m | grep ssh2
#返回消息如下,则为PHP版本问题
PHP Warning:  PHP Startup: ssh2: Unable to initialize module
Module compiled with module API=20240924
PHP    compiled with module API=20230831
These options need to match
 in Unknown on line 0

  这个时候需要将Debian下的PHP 8.3升级到8.4的版本即可。
  
  2、连接代码
  代码示例:

<?php
// 配置信息
$host = '192.168.100.100';
$port = 22;
$username = 'root';
$password = 'your_password';

// 1. 建立连接
$connection = ssh2_connect($host, $port);

if (!$connection) {
    die("错误:无法连接到服务器 $host");
}

// 2. 身份验证 (使用密码)
if (!ssh2_auth_password($connection, $username, $password)) {
    die("错误:用户名或密码错误");
}

echo "成功连接到 $host \n";

// 3. 执行命令
$command = 'ls -la /var/www/html && uptime';
$stream = ssh2_exec($connection, $command);

// 4. 获取执行结果
// 注意:ssh2_exec 返回的是一个资源流,需要设置阻塞模式以等待输出
stream_set_blocking($stream, true);
$output = stream_get_contents($stream);

// 5. 关闭流
fclose($stream);

// 输出结果
echo "执行结果如下:\n";
echo "--------------------------\n";
echo $output;
echo "--------------------------\n";
?>

  其他说明
  执行模式:ssh2_exec适合执行单条命令。如果需要交互式(如输入sudo密码),则需要使用ssh2_shell。
  错误处理:上述代码仅获取了stdout(标准输出)。如果命令执行失败,错误信息通常在stderr流中。
  超时设置:对于耗时很长的脚本,建议增加set_time_limit(0);防止PHP脚本超时退出。
  安全性:生产环境建议使用密钥对认证(ssh2_auth_pubkey_file)而非明文密码。
  常见问题排查
  1、函数未定义(Fatal error: Call to undefined function ssh2_connect):这100%是因为没有安装或启用ssh2扩展。
  2、连接被拒绝:请检查目标服务器的防火墙是否开放了22端口,以及sshd_config是否允许该用户登录。
  3、空输出:某些命令可能需要环境变量支持,或者命令本身将结果输出到了错误流。

返回首页    发布日期:2026年02月06日

Copyright © 2026  楚狐在线  All Rights ReservedAZ反馈留言  友情赞助