如何将SSH登录的banner信息通过管道输出到文本文件
根本原因
OpenSSH服务端配置的自定义预认证登录banner(即sshd_config中Banner字段指定的内容),默认会通过**标准错误流(stderr,文件描述符2)**输出;而常规的> out.txt重定向语法仅会捕获标准输出流(stdout,文件描述符1)的内容,这就导致banner内容直接打印到终端,不会被写入目标文件。
可行配置方案
方案1:重定向时同时捕获标准输出和标准错误流
这是改动最小、适配绝大多数场景的方案,执行SSH命令时调整重定向规则,把两个流的内容都写入目标文件即可。
POSIX标准兼容写法(所有shell通用):
ssh 远程主机地址 "远程脚本执行命令" > out.txt 2>&1
Bash/Zsh等常用Shell可以用简写语法:
ssh 远程主机地址 "远程脚本执行命令" &> out.txt
注意:2>&1必须写在输出文件路径的后面,顺序颠倒会导致重定向失效。
方案2:通过SSH客户端参数指定banner输出位置
如果不想调整Shell重定向规则,可以直接给SSH命令加-E参数,指定SSH连接日志(包含预认证banner)的输出位置:
如果要把banner和远程命令输出统一写入out.txt,可以把SSH日志指向标准输出流:
ssh -E /dev/stdout 远程主机地址 "远程脚本执行命令" > out.txt
如果需要分开存储连接信息和命令执行结果,也可以单独指定日志文件路径:
ssh -E ssh_connect.log 远程主机地址 "远程脚本执行命令" > out.txt
此时banner等SSH连接阶段的输出会写入ssh_connect.log,远程创建文件、ls -la的执行结果会写入out.txt。
方案3:适配登录后MOTD类提示的捕获
如果你的自定义提示内容是写在/etc/motd中的登录后欢迎信息,而非预认证banner,除了上述流重定向操作外,还需要给SSH命令加-t参数强制分配伪终端——非交互SSH会话默认不会输出MOTD内容:
ssh -t 远程主机地址 "远程脚本执行命令" &> out.txt
内容的提问来源于stack exchange,提问作者isakbob
相关产品推荐
相关产品推荐

