使用PHP登录SSH服务器时如何指定登录密码的问题咨询
问题原因
你当前使用的原生ssh命令默认禁止明文密码参数传递,会强制唤起交互式输入,所以无法直接在命令中拼接密码完成自动登录,以下是两种可直接落地的实现方案:
方案1:使用sshpass工具(适配你现有代码逻辑,改动最小)
首先需要在运行PHP的服务器上安装sshpass工具:
- Debian/Ubuntu系统执行:
apt install -y sshpass - CentOS/RHEL系统执行:
yum install -y sshpass
然后修改你的代码中的$cmd_string拼接逻辑即可,新增自动跳过主机密钥校验的参数避免首次连接卡交互:
<?php $server = "IP"; $username = "root"; $password = "pass"; $port = "22"; $command = "uptime"; // 拼接带sshpass的命令,新增参数跳过主机密钥确认,escapeshellarg防止特殊字符解析错误 $cmd_string = "sshpass -p ".escapeshellarg($password)." ssh -o StrictHostKeyChecking=no -p ".$port." ".$username."@".$server." ".$command; exec($cmd_string, $output, $return_var); echo '<pre>'; print_r($output); echo '</pre>'; ?>
方案2:使用PHP ssh2扩展(更安全,无需调用系统命令)
首先在运行PHP的服务器上安装ssh2扩展:
- Debian/Ubuntu系统执行:
apt install -y php-ssh2 - 通用安装方式:
pecl install ssh2
安装后重启PHP服务生效。
完整实现代码如下:
<?php $server = "IP"; $username = "root"; $password = "pass"; $port = 22; $command = "uptime"; // 建立SSH连接 $connection = ssh2_connect($server, $port); if (!$connection) die("SSH连接失败"); // 密码认证 if (!ssh2_auth_password($connection, $username, $password)) die("密码认证失败"); // 执行命令读取输出 $stream = ssh2_exec($connection, $command); stream_set_blocking($stream, true); $output = stream_get_contents($stream); fclose($stream); echo '<pre>'; echo $output; echo '</pre>'; ?>
更安全的替代方案:SSH密钥登录
不管用哪种方式传递明文密码都有泄露风险,推荐使用密钥认证实现无密码登录:
- 在运行PHP的服务器上执行
ssh-keygen -t rsa,一路回车生成密钥对 - 执行
ssh-copy-id -p 端口 用户名@远程服务器IP,把公钥上传到远程服务器 - 你原本的代码不需要任何修改,也不需要传递密码,运行时会自动用密钥完成认证,安全性最高。
内容的提问来源于stack exchange,提问作者yuptw llama
相关产品推荐
相关产品推荐

