Windows环境下SSH命令中换行符未生效的原因排查
问题解决方法
核心原因
- 脚本采用Windows换行符(CR LF)保存,MSYS2的Shell处理时会将CR字符传递给远程CMD,干扰命令解析逻辑。
- 远程环境是Windows CMD,它不像类Unix Shell那样将换行视为命令分隔符,多行命令会被合并成一行执行——CMD的
echo会输出所有后续参数,因此出现hello echo there的错误输出。
具体修复步骤
转换脚本换行符为Unix风格(LF)
在MSYS2终端执行以下命令,先安装转换工具(未安装时)再处理脚本:# 安装dos2unix工具 pacman -S dos2unix # 将脚本转换为LF换行 dos2unix test.sh调整SSH命令格式适配CMD规则
CMD用&(顺序执行所有命令)或&&(仅前命令成功时执行后续命令)作为命令分隔符,需把多行命令改成CMD可识别的格式:- 方式一:直接用分隔符拼接命令
修改脚本中的SSH部分为:ssh A-WINDOWS-SERVER "echo hello & echo there" - 方式二:保留多行写法自动转换分隔符
若想保留多行书写形式,可通过tr命令将换行替换为CMD的&:ssh A-WINDOWS-SERVER cmd /c "$(cat <<'EOF' echo hello echo there EOF | tr '\n' '&')" - 方式三:用嵌套引号明确指定CMD执行
ssh A-WINDOWS-SERVER 'cmd /c "echo hello && echo there"'
- 方式一:直接用分隔符拼接命令
验证结果
修改完成后重新运行sh test.sh,远程CMD会分别输出hello和there两行内容。
内容的提问来源于stack exchange,提问作者August Karlstrom
相关产品推荐
相关产品推荐

