请求编写Linux Bash脚本:批量验证SSH登录并输出状态
批量SSH登录脚本优化
你的原有脚本仅能捕获登录成功的输出,未处理失败场景,且用for i in \cat IP.txt``的方式在IP包含特殊字符时易出问题。以下是优化后的脚本,可同时处理成功/失败场景并输出指定格式内容:
#!/bin/bash OUTPUT_FILE="outputIP.txt" # 清空输出文件(若需保留历史记录可删除此行) > "$OUTPUT_FILE" while read -r ip; do # 跳过空行 [[ -z "$ip" ]] && continue # 执行SSH命令,禁用主机密钥检查、设置10秒超时,捕获远程输出 server_info=$(sshpass -p "abcd" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 fsp@"$ip" 2>/dev/null << 'EOF' # 远程执行:拼接主机名与系统版本信息 echo "$(hostname) - $(grep PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '"'')" EOF ) # 记录SSH命令的退出状态码(0为成功,非0为失败) exit_status=$? if [[ $exit_status -eq 0 ]]; then echo "Success: $server_info" >> "$OUTPUT_FILE" else echo "failed [$ip] connection" >> "$OUTPUT_FILE" fi done < "IP.txt"
关键优化点说明
- 用
while read -r ip读取IP列表:比for循环更健壮,能正确处理空行及含特殊字符的IP(虽IP一般无此情况,但通用性更强) - SSH参数优化:
-o StrictHostKeyChecking=no避免首次登录时弹出主机密钥确认的交互,防止脚本卡住;-o ConnectTimeout=10设置10秒超时,避免长时间等待无响应的IP - 单次SSH连接完成信息获取:减少网络开销,同时用
2>/dev/null屏蔽SSH的错误提示(如认证失败、超时),避免干扰输出文件 - 基于退出状态码判断结果:通过
$?获取上一条命令的执行状态,精准区分登录成功/失败场景,输出对应格式内容
内容的提问来源于stack exchange,提问作者Dumitrescu Cristi
相关产品推荐
相关产品推荐

