Shell脚本不执行仅输出带-c前缀命令 如何排查解决?
SSH远程执行命令仅输出带
-c前缀内容的排查与解决方案 根因说明
SSH 远程执行非交互式命令时,会默认调用远程对应用户的默认 shell,以[shell路径] -c [用户输入的命令]的格式执行。如果出现仅输出-c + 命令内容的情况,核心原因是远程的shell执行逻辑被替换成了仅打印参数的程序,最常见的场景是默认shell被误设为echo。
排查步骤
- 验证交互式登录是否正常:执行
ssh user@mainframe尝试登录远程主机,如果登录后直接退出、无正常命令行提示符,即可确认是远程用户的默认shell配置异常。 - 检查远程用户默认shell:如果可以正常交互式登录,登录后执行
echo $SHELL查看当前默认shell路径,确认该路径对应的二进制文件是否为合法shell,是否存在被篡改、替换为echo的情况。 - 检查用户登录启动脚本:依次检查远程用户目录下的
~/.ssh/rc、~/.bashrc、~/.profile、~/.bash_profile等文件,确认是否存在异常的echo $*后直接exit的逻辑,这类逻辑会拦截后续命令执行、直接打印参数。 - 检查sshd全局配置:查看远程主机
/etc/ssh/sshd_config文件中的ForceCommand配置项,如果该参数被设置为echo之类的打印命令,会强制所有SSH连接执行该命令,忽略用户提交的实际执行内容。
修复方案
- 默认shell配置异常:使用root权限登录远程主机,执行
chsh -s /bin/bash user(将user替换为实际SSH登录的用户名,shell路径可根据实际需求替换为/bin/sh、/bin/zsh等合法shell路径)即可恢复。 - 启动脚本异常:删除登录启动脚本中新增的异常打印、直接退出的逻辑,保存后重新执行SSH命令即可生效。
- sshd配置异常:修改
/etc/ssh/sshd_config删除或修正错误的ForceCommand配置,执行systemctl restart sshd(对应主机的sshd重启命令可根据操作系统适配)重启服务后生效。
内容的提问来源于stack exchange,提问作者work-tech
相关产品推荐
相关产品推荐

