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
相关产品推荐
相关产品推荐

