PHP执行SSH远程连接命令失败,请求排查问题原因
问题排查与解决方案
你遇到的ssh命令执行失败返回null的问题,核心原因及对应解决方法如下:
1. SSH命令为交互式登录,非交互式环境无法执行
直接运行ssh omcuser@10.18.16.166会触发交互式登录流程(需要终端输入密码或确认主机密钥),但shell_exec运行在web服务器的非交互式环境中,没有终端支持,导致命令卡住或直接失败,返回null。
解决方法:
不要仅执行登录命令,而是直接指定要在远程服务器执行的具体操作,同时捕获错误输出(将stderr重定向到stdout):
// 替换为你实际需要执行的远程命令,比如查询文件、运行脚本等 $ssh_command = 'ssh omcuser@10.18.16.166 "ls -l /path/to/target" 2>&1'; $ssh_output = shell_exec($ssh_command);
2. Web服务器用户无免密登录权限
web服务器进程通常以apache或www-data用户运行,该用户未配置与远程服务器omcuser的免密SSH登录,导致ssh命令需要输入密码,但非交互式环境无法提供输入,最终执行失败。
解决方法:
- 切换到web服务器用户:
su - apache # 不同系统可能是su - www-data - 生成无密码的SSH密钥对(一路回车,不要设置密码):
ssh-keygen -t rsa - 将公钥复制到远程服务器的
omcuser账户:
若ssh-copy-id omcuser@10.18.16.166ssh-copy-id不可用,手动复制本地~/.ssh/id_rsa.pub的内容,粘贴到远程服务器/home/omcuser/.ssh/authorized_keys文件中,并确保权限正确:# 在远程服务器执行 chmod 700 /home/omcuser/.ssh chmod 600 /home/omcuser/.ssh/authorized_keys
3. 额外问题:test.sh脚本变量未解析
你的代码中执行test.sh时使用了单引号,导致$msisdn和$date变量不会被PHP解析,脚本会收到字面量$msisdn而非实际提交的值,建议修改为双引号:
$output = shell_exec("./test.sh $msisdn $date 2>&1");
验证方法
先在服务器上手动以web用户身份执行ssh命令,测试是否能正常运行:
su - apache ssh omcuser@10.18.16.166 "echo test"
手动执行时若有错误,会直接显示错误信息,方便进一步排查。
内容的提问来源于stack exchange,提问作者Pathi
相关产品推荐
相关产品推荐

