维护系统中端到端的网络通信也许并不是开发者要亲力亲为的事,但对于某些场景又必须由应用进行端到端的验证,比如配合网络设备的变更或升级等
对于默认没有安装 telnet 的 Linux 系统,可以使用 NetCat 进行探测。NetCat 是一款简单的 Unix 工具,使用 UDP 和 TCP 协议。 是一个可靠的容易被其他程序所启用的后台操作工具,同时它也被用作网络的测试工具或黑客工具。 使用它可以轻易的建立任何连接,内建有很多实用的工具
这样基于 NetCat 我们就可以在某台主机上一次性对该主机到其它若干主机的各种端口做连接性测试,当然需要加上一个关键的参数 -z
z 参数在连接成功后立即关闭连接,不进行数据交换
配合这个参数可以写一个脚本通过读取 IP 和 Port 列表,依次执行 nc 命令即可
最近在测试时发现如果碰巧你的 Netcat 版本较低,那么很可能不支持 -z
参数,为了同样达到验证网络的目的,可以通过模拟键盘中断的方式稍微改进一下脚本即可
[jc@test network-conn]$ nc --version
Ncat: Version 6.40 ( http://nmap.org/ncat )
[jc@test network-conn]$ tree
.
├── ip_port
└── nc.sh
0 directories, 2 files
ip_port 文件以每行一对 IP + Port 的方式列写对端网络信息
10.1.1.241 80
10.1.1.241 90
10.1.1.242 80
逐行读取上述文件,进行连接测试,每次测试后主动中断(这里使用了 kill 的 2 号信号,可以 man kill 查看具体说明)
#!/bin/sh
# load system function
. /etc/init.d/functions
#chech present user
current_user=`whoami`
if [[ "$current_user" == "chenjingchao" ]];then
action "ensure user is chenjingchao" /bin/true
else
action "run script by chenjingchao" /bin/false
exit 1
fi
base_path=$(cd "$(dirname "$0")";pwd)
# use base_path if ip_port can not found
cat ip_port | while read line
do
{
echo $line
nc -v $line &
sleep 1
NCPID=`ps -ef | grep nc\ -v | awk '{print $2}' | sed -n '1p'`
echo "NCPID:$NCPID"
kill -2 $NCPID
echo "======================================================================"
}
done
chenjingchao@test network-conn]$ sh nc.sh
ensure user is chenjingchao [ OK ]
10.1.1.241 80
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 10.1.1.241:80.
Ncat: 0 bytes sent, 0 bytes received in 0.00 seconds.
NCPID:5921
======================================================================
10.1.1.241 90
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connection refused.
NCPID:5921
======================================================================
10.1.1.242 80
Ncat: Version 6.40 ( http://nmap.org/ncat )
NCPID:5921
======================================================================
[jc@test network-conn]$ Ncat: No route to host.