You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.166
    
    若ssh-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:43:25