Shell 脚本 - telnet 多个 hosts:ports
Shell Script - telnet multiple hosts:ports
无论如何我都不是 shell 脚本方面的专家。
我从另一个 post (Bash script telnet to test multiple addresses and ports) 那里得到了结构的想法
我的需求是通过 telnet 验证特定主机和端口之间的 LAN 连接。
使用 telnet 的原因是 LAN 和机器都非常安全,我无法访问 netcat、nmap 或 /dev/tcp。我也不太愿意 Python 或 Pearl 尝试那条路线......(我知道我很傻,不过我会到达那里 :P )。
以下代码有效,但是出于我无法理解的原因,while 循环仅迭代一次,不再重复...:( .
注意:了解连接是否因超时而失败或被拒绝(端口在端点关闭)对我来说很重要。
任何人都可以帮助我 1) 修复它和 2) 了解原因吗?
仅供参考:对于可能有类似需求的任何其他人,这里是该脚本的完全可操作的更新代码。
在这种情况下,连接被拒绝被视为成功(测试防火墙规则),可以根据需要更改为失败。
#!/bin/bash
path=`pwd`;
touch $path/test_telnet.out || exit;
touch $path/success.log || exit;
touch $path/failed.log || exit;
echo "10.192.168.1 1200
10.10.10.2 80
10.220.2.8 6090
10.220.2.9 6090" | ( while read host port; do
telnet $host $port </dev/null > $path/test_telnet.out 2>&1 & sleep 1; kill $!;
if grep Connected $path/test_telnet.out >/dev/null;
then
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ OPEN ] | tee -a $path/success_log.txt;
elif grep refused $path/telnet_test.txt >/dev/null; then
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ REFUSED ] | tee -a $path/success_log.txt;
else
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ TIMEOUT ] | tee -a $path/failed_log.txt;
fi;
cp /dev/null $path/test_telnet.out;
done
) 2>/dev/null #avoid bash messages
正如 Etan 评论的那样,telnet 正在吞噬您剩余的输入。解决方法是重定向 telnet 的输入。
改变这个:
telnet $host $port > ~/test_con/telnet_test.txt
对此:
telnet $host $port </dev/null > ~/test_con/telnet_test.txt
我已经添加了一个 shell 脚本文件,只是 运行 这个。此脚本从下面的列表中获取服务器和端口。
for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
do
(echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
done
done
无论如何我都不是 shell 脚本方面的专家。 我从另一个 post (Bash script telnet to test multiple addresses and ports) 那里得到了结构的想法 我的需求是通过 telnet 验证特定主机和端口之间的 LAN 连接。
使用 telnet 的原因是 LAN 和机器都非常安全,我无法访问 netcat、nmap 或 /dev/tcp。我也不太愿意 Python 或 Pearl 尝试那条路线......(我知道我很傻,不过我会到达那里 :P )。
以下代码有效,但是出于我无法理解的原因,while 循环仅迭代一次,不再重复...:( .
注意:了解连接是否因超时而失败或被拒绝(端口在端点关闭)对我来说很重要。
任何人都可以帮助我 1) 修复它和 2) 了解原因吗?
仅供参考:对于可能有类似需求的任何其他人,这里是该脚本的完全可操作的更新代码。 在这种情况下,连接被拒绝被视为成功(测试防火墙规则),可以根据需要更改为失败。
#!/bin/bash
path=`pwd`;
touch $path/test_telnet.out || exit;
touch $path/success.log || exit;
touch $path/failed.log || exit;
echo "10.192.168.1 1200
10.10.10.2 80
10.220.2.8 6090
10.220.2.9 6090" | ( while read host port; do
telnet $host $port </dev/null > $path/test_telnet.out 2>&1 & sleep 1; kill $!;
if grep Connected $path/test_telnet.out >/dev/null;
then
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ OPEN ] | tee -a $path/success_log.txt;
elif grep refused $path/telnet_test.txt >/dev/null; then
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ REFUSED ] | tee -a $path/success_log.txt;
else
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ TIMEOUT ] | tee -a $path/failed_log.txt;
fi;
cp /dev/null $path/test_telnet.out;
done
) 2>/dev/null #avoid bash messages
正如 Etan 评论的那样,telnet 正在吞噬您剩余的输入。解决方法是重定向 telnet 的输入。
改变这个:
telnet $host $port > ~/test_con/telnet_test.txt
对此:
telnet $host $port </dev/null > ~/test_con/telnet_test.txt
我已经添加了一个 shell 脚本文件,只是 运行 这个。此脚本从下面的列表中获取服务器和端口。
for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
do
(echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
done
done