Bash命令SSH检查输出无法保存至文件/变量问题排查
为什么SSH权限提示没写入文件/变量?
这个问题我之前排查SSH自动化脚本的时候也踩过一模一样的坑!核心原因其实很简单:SSH的权限拒绝这类提示信息,是输出到「标准错误流(stderr)」,而不是我们默认重定向的「标准输出流(stdout)」。
具体原因拆解
平时我们用command > file.txt这种写法,只会把命令的正常输出(比如SSH成功连接后的欢迎信息、执行命令的返回结果这类stdout内容)写入文件,但像权限拒绝、连接超时、主机不存在这类错误提示,程序会专门放到stderr流里——默认情况下stderr是直接输出到终端的,所以你看不到它被写入文件。
而你提到的「另一种操作能正常保存」,大概率是那种输出全是stdout的命令(比如ls > file.txt),所以默认重定向就直接生效了。
解决办法
1. 把错误信息也写入文件
如果要把所有输出(包括正常结果和错误提示)都写到文件里,有两种常用写法:
- 兼容多数Shell的通用写法:
这里的ssh user@your-host > temp.txt 2>&12>&1意思是「把stderr(文件描述符2)重定向到stdout(文件描述符1)的输出位置」,这样两种流的内容都会进到temp.txt里。 - Bash/Zsh等现代Shell的简化写法:
这是ssh user@your-host &> temp.txt> temp.txt 2>&1的简写,更直观易懂。
如果只想单独捕获错误信息(比如只保存权限拒绝的提示),可以只重定向stderr:
ssh user@your-host 2> temp.txt
2. 把所有输出保存到变量
要把SSH的所有输出(包括错误提示)存到变量里,同样需要合并stderr和stdout:
ssh_output=$(ssh user@your-host 2>&1)
之后你就可以通过echo "$ssh_output"查看变量内容,不管是成功连接的输出还是权限拒绝的提示都会被保存下来。
内容的提问来源于stack exchange,提问作者adamconkey
相关产品推荐
相关产品推荐

