SSH远程执行带sudo自动密码的命令时日志出现^M问题
问题原因与解决方法
问题根源
出现^M(即回车符\r)的核心原因是**ssh -t强制分配的伪终端(TTY)触发了换行符转换**:
- 当你通过
echo 123123 | sudo -S传递密码时,TTY环境会将echo输出的换行符\n转换为\r\n(CRLF格式); - 后续
make命令的输出会继承这个TTY的换行处理逻辑,导致每行末尾被添加\r,最终在日志中显示为^M。 - 本地执行或手动输入密码的场景中,要么无TTY转换(本地执行),要么手动输入的回车由终端直接处理,不会影响后续命令的输出换行格式,因此没有^M。
解决方法
方法1:移除ssh -t选项
sudo -S通过标准输入读取密码,不需要伪终端支持,去掉-t即可避免TTY的换行转换:
ssh user@localhost "echo 123123 | sudo -S bash -c \"export TERM=dumb && cd /home/user/redis_research/ && make clean && make\" " &> rx_tmp.log
方法2:用printf替代echo输出密码
若必须保留ssh -t(比如远程命令依赖TTY),printf的输出更可控,不会触发额外的换行符转换:
ssh -t user@localhost "printf '123123\n' | sudo -S bash -c \"export TERM=dumb && cd /home/user/redis_research/ && make clean && make\" " &> rx_tmp.log
方法3:过滤输出中的\r
在远程命令的输出管道中添加tr -d '\r',直接去掉回车符:
ssh -t user@localhost "echo 123123 | sudo -S bash -c \"export TERM=dumb && cd /home/user/redis_research/ && make clean && make\" | tr -d '\r'" &> rx_tmp.log
内容的提问来源于stack exchange,提问作者user12815541
相关产品推荐
相关产品推荐

