2015-04-01 69 views
0

我不是shell程序的专家。 我从另一篇文章中得到了结构思想(Bash script telnet to test multiple addresses and ports) 我需要通过telnet验证特定主机和端口之间的LAN连接。Shell脚本 - telnet多个主机:端口

使用telnet的原因是LAN和机器都非常安全,而且我无法访问netcat,nmap或/ dev/tcp。我也不太喜欢用Python或Pearl来尝试这条路线......(我知道我很傻,但我会到达那里:P)。 。

下面的代码工作,但是,对于我无法理解的原因,而循环迭代只有一次,没有更多... :(

注:它是非常重要,我知道,如果连接因超时而失败或被拒绝(端口关闭)

任何人都可以帮助我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 
+2

如果'telnet'工作在所有喜欢'ssh'则你的循环可以循环饭前标准输入的内容。将stdin重定向到telnet进程,看看是否有帮助。 – 2015-04-01 13:55:00

+0

@EtanReisner如果我在做迭代时'telnet $ host $ port <> ...',但是telnet内的'$ host $ port'不会改变值。 :( – TPatriot 2015-04-01 15:43:30

+0

我不明白,标准输入重定向不会改变shell命令行上的变量扩展,telnet不知道有变量,如果重定向标准输入使得循环继续,那么'read'将读取下一行并适当地设置'host'和'port',这样它们就可以在每次循环中工作。首先尝试一个更简单的情况,以确保它能够正常工作:'echo .... | while read host port“; echo”host:$ host“; echo”port:$ port“; done'。 – 2015-04-01 15:45:49

回答

1

正如Etan评论的那样,telnet正在吃剩下的输入。解决的办法是重定向telnet的输入。

更改此:

telnet $host $port > ~/test_con/telnet_test.txt 

这样:

telnet $host $port </dev/null > ~/test_con/telnet_test.txt 
+0

非常感谢Etan在后台进程中的指示,我用'telnet $ host $ port〜/ test_con/telnet_test.txt&(sleep 2; kill $!)编辑了这一行'&'它是ALIIIIIVE!:) 现在隐藏随机出现在bash中的连接消息:P – TPatriot 2015-04-01 16:45:50

+0

您可能想要将telnet的stderr重定向到/ dev/null – 2015-04-01 16:49:24

相关问题