如何在Bash脚本中中断SSH命令并保存调试日志至文件,以获取远程服务器的KEX、MAC及密码套件信息
解决SSH调试脚本卡在密码提示符的问题
要获取远程服务器实际支持的KEX、MAC和密码套件信息,你可以通过以下几个关键点修改脚本,完美避开密码提示符的阻塞:
核心思路
- 启用
BatchMode=yes参数:这个参数会强制SSH禁用所有交互式输入(包括密码提示),当服务器需要密码验证但本地没有可用密钥时,SSH会直接终止连接,不会卡在等待输入的状态。 - 捕获标准错误输出:SSH的调试日志(包括
debug2开头的服务器算法提案)是输出到**标准错误(stderr)**的,而非标准输出(stdout),所以需要专门把stderr重定向到文件。 - 精准过滤关键信息:从调试输出中提取你需要的KEX、ciphers、MAC相关行,不用手动翻找整份日志。
完整脚本示例
#!/bin/bash # 安全遍历servers.txt中的每个主机(处理含空格/特殊字符的主机名) while IFS= read -r host; do # 跳过空行 [[ -z "$host" ]] && continue echo "正在处理主机: $host" # 定义以主机名命名的输出文件 output_file="${host}_ssh_debug.log" # 执行SSH命令:启用调试+批量模式,将错误日志写入文件 ssh -vvv -o BatchMode=yes "$host" 2> "$output_file" # 从日志中提取关键算法信息并打印(方便快速查看结果) echo "=== $host 支持的核心算法信息 ===" grep -E "debug2: (KEX algorithms|ciphers|MAC algorithms|host key algorithms)" "$output_file" echo "---------------------------------" done < servers.txt
脚本细节说明
IFS= read -r host:避免处理包含空格或特殊字符的主机名时出现截断问题,是读取文件行的安全写法。ssh -vvv -o BatchMode=yes "$host":BatchMode=yes彻底杜绝交互式等待,-vvv输出最详尽的调试日志,确保能捕获到服务器的算法提案。2> "$output_file":把SSH的错误输出(也就是调试日志)定向到指定文件,不会污染终端的标准输出。grep -E ...:精准过滤出你关心的算法行,直接在终端展示结果,不用手动打开日志文件翻找。
额外补充:获取主机密钥信息
如果你还想同步收集远程服务器的主机密钥,可以在脚本中添加一行:
ssh-keyscan "$host" >> "${host}_ssh_debug.log"
这样日志文件会同时包含服务器的算法提案和主机密钥信息,更全面。
内容的提问来源于stack exchange,提问作者dexter
相关产品推荐
相关产品推荐

