php实现ssh
使用 phpseclib 库实现 SSH
phpseclib 是一个纯 PHP 实现的 SSH 库,支持 SSH2 协议,无需系统安装 SSH 扩展。以下是使用 phpseclib 进行 SSH 连接和操作的示例。
安装 phpseclib:
composer require phpseclib/phpseclib
建立 SSH 连接:
<?php
require 'vendor/autoload.php';
use phpseclib3\Net\SSH2;
$ssh = new SSH2('hostname');
if (!$ssh->login('username', 'password')) {
exit('Login Failed');
}
echo $ssh->exec('ls -la');
?>
使用原生 SSH2 扩展
PHP 的 SSH2 扩展提供原生 SSH 功能,需先确保服务器安装该扩展。
安装 SSH2 扩展:
pecl install ssh2
使用示例:

<?php
$connection = ssh2_connect('hostname', 22);
if (ssh2_auth_password($connection, 'username', 'password')) {
$stream = ssh2_exec($connection, 'ls -la');
stream_set_blocking($stream, true);
echo stream_get_contents($stream);
}
?>
执行远程命令并获取输出
通过 SSH 执行命令并实时获取输出:
$ssh = new SSH2('hostname');
$ssh->login('username', 'password');
$command = 'tail -f /var/log/syslog';
$ssh->exec($command, function($str) {
echo $str;
});
SFTP 文件传输
使用 phpseclib 进行 SFTP 文件传输:
use phpseclib3\Net\SFTP;
$sftp = new SFTP('hostname');
$sftp->login('username', 'password');
$sftp->put('remote_file.txt', 'local_file.txt', SFTP::SOURCE_LOCAL_FILE);
$sftp->get('remote_file.txt', 'local_file.txt');
密钥认证登录
使用密钥代替密码认证:

use phpseclib3\Net\SSH2;
use phpseclib3\Crypt\PublicKeyLoader;
$key = PublicKeyLoader::load(file_get_contents('/path/to/private.key'));
$ssh = new SSH2('hostname');
$ssh->login('username', $key);
处理长时间运行命令
对于需要长时间运行的命令,建议使用 nohup 或 screen:
$command = 'nohup long_running_script.php > /dev/null 2>&1 &';
$ssh->exec($command);
错误处理与调试
增加错误处理和调试信息:
try {
$ssh = new SSH2('hostname');
if (!$ssh->login('username', 'password')) {
throw new Exception('Login failed');
}
echo $ssh->exec('whoami');
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
性能优化建议
对于频繁的 SSH 操作,保持连接而不是每次新建:
$ssh->write("command1\n");
$output1 = $ssh->read();
$ssh->write("command2\n");
$output2 = $ssh->read();
安全注意事项
确保敏感信息如密码和密钥不被暴露:
- 将认证信息存储在环境变量中
- 设置适当的文件权限
- 考虑使用 SSH 代理转发
以上方法提供了从基础到高级的 PHP SSH 实现方案,可根据具体需求选择适合的方式。phpseclib 方案兼容性最好,而原生 SSH2 扩展性能更佳。






