#!/bin/bash
# 检测 IP 列表文件中的主机 SSH 端口(22)是否开放
# 用法: ./ssh_port_check.sh <ip_list_file> [output_log_file]
# 默认输出文件名(带时间戳)
DEFAULT_LOG_FILE="ssh_check_result_$(date +%Y%m%d_%H%M%S).log"
# 检查参数
if [ $# -lt 1 ]; then
echo "用法: $0 <ip_list_file> [output_log_file]"
echo "示例: $0 ip_list.txt # 自动生成日志文件"
echo " $0 ip_list.txt result.log # 指定日志文件"
exit 1
fi
IP_FILE="$1"
LOG_FILE="${2:-$DEFAULT_LOG_FILE}"
# 检查 IP 列表文件是否存在
if [ ! -f "$IP_FILE" ]; then
echo "错误: 文件 '$IP_FILE' 不存在"
exit 1
fi
# 选择端口检测工具:优先 nc,其次使用 bash 的 /dev/tcp
if command -v nc &> /dev/null; then
CHECK_CMD="nc -z -w 1"
echo "使用 nc 进行端口检测" | tee -a "$LOG_FILE"
elif [ -r /dev/tcp ] || { [ -w /dev/tcp ] && [ -x /dev/tcp ]; } 2>/dev/null; then
# Bash 的 /dev/tcp 特性(需要 bash,且未被禁用)
CHECK_CMD="bash -c 'timeout 1 bash -c \"echo >/dev/tcp/\$1/22\"' --"
echo "使用 /dev/tcp 进行端口检测" | tee -a "$LOG_FILE"
else
echo "错误: 未找到 nc 命令且 /dev/tcp 不可用,请安装 netcat (nc)。" | tee -a "$LOG_FILE"
exit 1
fi
# 清空(或创建)日志文件,并写入开始信息
echo "检测开始时间: $(date '+%Y-%m-%d %H:%M:%S')" | tee "$LOG_FILE"
echo "IP 列表文件: $IP_FILE" | tee -a "$LOG_FILE"
echo "检测端口: 22 (SSH)" | tee -a "$LOG_FILE"
echo "----------------------------------------" | tee -a "$LOG_FILE"
TOTAL=0
REACHABLE=0
UNREACHABLE=0
# 端口检测函数
check_ssh_port() {
local ip="$1"
if [[ "$CHECK_CMD" == "nc -z -w 1" ]]; then
nc -z -w 1 "$ip" 22 &> /dev/null
else
# 使用 /dev/tcp 方式
timeout 1 bash -c "echo >/dev/tcp/$ip/22" &> /dev/null
fi
}
# 逐行读取 IP 地址
while IFS= read -r ip || [ -n "$ip" ]; do
# 跳过空行和注释行
[[ -z "$ip" || "$ip" =~ ^# ]] && continue
TOTAL=$((TOTAL + 1))
if check_ssh_port "$ip"; then
echo "SSH端口可达 : $ip:22" | tee -a "$LOG_FILE"
REACHABLE=$((REACHABLE + 1))
else
echo "SSH端口不可达 : $ip:22" | tee -a "$LOG_FILE"
UNREACHABLE=$((UNREACHABLE + 1))
fi
done < "$IP_FILE"
echo "----------------------------------------" | tee -a "$LOG_FILE"
echo "检测完成: 总计 $TOTAL, SSH可达 $REACHABLE, 不可达 $UNREACHABLE" | tee -a "$LOG_FILE"
echo "日志已保存至: $LOG_FILE"
使用方法
保存脚本为 ssh_port_check.sh,执行 chmod +x ssh_port_check.sh。
准备 IP 列表文件(每行一个 IP,支持空行和 # 注释):
text
192.168.1.1
10.0.0.5
8.8.8.8
example.com
运行:
./ssh_port_check.sh ip_list.txt
或指定日志文件:./ssh_port_check.sh ip_list.txt my_ssh_result.log
依赖说明
推荐安装 netcat(nc):
Ubuntu/Debian:sudo apt install netcat-openbsd
CentOS/RHEL:sudo yum install nc
如果没有 nc,脚本会尝试使用 /dev/tcp(仅限 Bash,且某些系统可能禁用)。为了稳定,建议安装 nc。
文档更新时间: 2026-04-14 09:21 作者:月影鹏鹏