SSH远程执行命令返回结果换行符转为空格的原因排查
问题原因与解决方案
这个问题其实不是SSH把换行符转成了空格,问题出在bash处理变量展开的逻辑上!
为什么会出现这种情况?
当你用VARcmdChk="$(ssh ...)"把远程命令的结果存入变量时,SSH返回的输出里其实是保留了换行符的。但当你执行echo ${VARcmdChk}时,bash会把变量中的换行符、空格、制表符都视为“单词分隔符”,自动将它们替换成空格,然后把所有内容合并成一行输出——这才是换行消失的真正原因。
解决方法(不用scp,本地直接查看)
这里有几个简单的办法可以保留换行:
用双引号包裹变量输出:
执行echo "${VARcmdChk}",双引号会告诉bash要保留变量里的原始格式(包括换行符),这样输出就会和本地执行时一样正常换行了。直接远程执行命令,不存入变量:
如果你不需要把结果存下来后续处理,直接运行远程命令即可:ssh ${VARuser}@${VARserver} "find ~/logs/ -iname 'status' | xargs grep 'last seen' | sort --field-separator=: -k 4 -g"这样远程命令的输出会直接通过SSH传输到本地终端,终端会正常解析换行符显示。
用printf代替echo:
printf对格式的处理更严谨,执行printf '%s' "$VARcmdChk"也能完整保留变量中的换行符。
内容的提问来源于stack exchange,提问作者sarlacii
相关产品推荐
相关产品推荐

