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

Redhat环境下system调用执行ssh、shell脚本返回256/127错误求助

问题1:system()调用ssh命令返回256

根因分析

  • system()的返回值并非被调用命令的直接返回值,需要通过WEXITSTATUS宏解析才能拿到命令真实退出码,256解析后的值为1,对应ssh通用执行错误。
  • 终端能正常执行ssh但C程序调用失败,通常是三个原因:
    • 非交互环境下ssh默认需要读取标准输入获取交互内容,没有tty时会直接异常退出
    • C程序运行环境的HOME环境变量和终端不一致,导致ssh找不到~/.ssh目录下的RSA密钥
    • 你的ssh命令没有指定要执行的远程命令,默认尝试启动交互式shell,非交互场景下会直接退出返回错误

解决方案

  • 首先用WEXITSTATUS宏解析system()返回值,获取命令真实退出状态:
#include <sys/wait.h> // 需引入该头文件使用WEXITSTATUS
int ret = system(cmd2);
int real_exit_code = WEXITSTATUS(ret);
  • 修改ssh命令参数,适配非交互场景:
// 加-n参数禁止ssh从标准输入读数据,加-o BatchMode=yes禁用交互式密码输入,末尾加远程要执行的命令
char cmd2[256] = "ssh -n -o BatchMode=yes user@remote-hostname 'echo connect_success'";
  • 确认C程序运行环境的HOME环境变量正确,可在代码中临时增加调试命令验证:
system("echo $HOME && ls -l ~/.ssh/id_rsa");

如果输出的密钥路径和你终端配置的路径不一致,可在C程序中提前设置HOME环境变量:

setenv("HOME", "/home/你的实际用户名", 1);

问题2:system()调用shell脚本返回127

根因分析

127错误码是Linux下「命令未找到」的标准错误,你的写法问题出在两处:

  • sh -c example.sh的写法错误:sh -c后面接的是完整命令字符串,你直接写example.sh系统会去PATH环境变量的路径中搜索该命令,不会自动查找当前目录下的文件
  • 用分号;连接cd命令和后续命令,若cd /path执行失败(比如路径不存在、无权限),后续命令仍会在原路径执行,也会找不到脚本

解决方案

根据你的使用场景选任意一种即可:

  • 去掉多余的-c参数,同时用&&替换分号保证执行顺序安全:
system("cd /path && sh example.sh");
  • 保留-c参数的话,明确指定脚本的相对路径:
system("cd /path && sh -c './example.sh'");
  • 提前给脚本加可执行权限后直接执行(更简洁):
    先在终端执行一次权限配置:chmod +x /path/example.sh
    之后C程序中直接调用:
system("cd /path && ./example.sh");

内容的提问来源于stack exchange,提问作者user10293779

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:24:02