Board logo

标题: [网络连接] 批处理怎样从文本中读取IP进行ping和端口进行telnet,并将结果另存为文本? [打印本页]

作者: ylmaster    时间: 2023-4-23 16:41     标题: 批处理怎样从文本中读取IP进行ping和端口进行telnet,并将结果另存为文本?

RT,因需要对批量的ip连通性和不同端口进行测试,希望能使用批处理解决这个需求:
1、需要ping测试的ip保存在ip_list.txt中,格式如下:
192.168.1.1
192.168.2.3
172.16.18.5
10.10.10.100
10.8.172.22

2、需要telnet测试的ip及端口保存在port_list.txt中,格式如下:
192.168.3.19 8080
192.168.188.18 9221
172.18.16.3 22
172.16.99.1 2511
10.10.88.254 9090

3、使用批处理分别调用1、2中对应的文本或者如果可以直接调用2中的文本实现对应的ping和telnent,并将结果输出到一个ping&telent_result.txt文本文档中,ping可以直接显示Ping的记录,类似“ping 192.168.1.1 >>ping.txt”这种记录就行,telnent在文本中能显示telnent端口通或者不通,如果能是以下格式显示最好:
IP地址 端口通断
192.168.3.19 8080端口正常
192.168.188.18 9221端口正常
172.18.16.3 22端口正常
172.16.99.1 2511端口异常
10.10.88.254 9090端口异常

最后万分感谢能帮助的大佬,让小弟能感受到批处理的强大从而更加努力的向大佬们靠拢!
作者: Gin_Q    时间: 2023-4-23 18:15

python3 版
  1. import socket
  2. import pathlib
  3. import subprocess
  4. class IpTest(object):
  5.     def __init__(self, ip_address_file:pathlib.Path, res_file:pathlib.Path) -> None:
  6.         
  7.         self.ip_address_file = ip_address_file
  8.         self.ping_res_file = res_file
  9.         self.ip_address_list = []
  10.     def load_ip_address(self) -> None:
  11.         self.ip_address_list.clear()
  12.         with self.ip_address_file.open() as f:
  13.             for ip in f.readlines():
  14.                 self.ip_address_list.append(ip.strip())
  15.     def run_ip_test(self) -> None:
  16.         pass
  17. class PingIP(IpTest):
  18.     def __init__(self, ip_address_file: pathlib.Path, res_file: pathlib.Path) -> None:
  19.         super().__init__(ip_address_file, res_file)
  20.     def run_ip_test(self) -> None:
  21.         res_file = self.ping_res_file.name
  22.         if self.ping_res_file.exists():
  23.             self.ping_res_file.unlink()
  24.         for ip in self.ip_address_list:
  25.             
  26.             print(f"start: ping {ip} -n 2 >> {res_file}")
  27.             subprocess.run(f"ping {ip} -n 2 >> {res_file}", shell=True)
  28.             print(f"done: ping {ip} -n 2 >> {res_file}")
  29. class Telnent(IpTest):
  30.     def __init__(self, ip_address_file: pathlib.Path, res_file: pathlib.Path) -> None:
  31.         super().__init__(ip_address_file, res_file)
  32.     @staticmethod
  33.     def connect_ip(ip:str, port:int) -> bool:
  34.         sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  35.         sck.settimeout(2) # 2 second
  36.         try:
  37.             sck.connect((ip,port))
  38.         except:
  39.             return False
  40.         finally:
  41.             sck.close()
  42.         return True
  43.     def run_ip_test(self) -> None:
  44.         
  45.         ip_ino:str
  46.         with self.ping_res_file.open("w") as f:
  47.             for ip_ino in self.ip_address_list:
  48.                 print(f"正在连接:{ip_ino}")
  49.                 ip,port = ip_ino.split(" ")
  50.                 if self.connect_ip(ip,int(port)):
  51.                     f.write(f"{ip_ino}端口正常\n")
  52.                 else:
  53.                     f.write(f"{ip_ino}端口异常\n")
  54. if __name__ == "__main__":
  55.     p_set = []
  56.     p_set.append(PingIP(pathlib.Path("ip_list.txt"), pathlib.Path("ping_result.txt")))
  57.     p_set.append(Telnent(pathlib.Path("port_list.txt"), pathlib.Path("Telnent_result.txt")))
  58.     for p in p_set:
  59.         p.load_ip_address()
  60.         p.run_ip_test()
复制代码

作者: ylmaster    时间: 2023-4-24 10:08

回复 2# Gin_Q


    大佬,这咋用啊,python没学过哇
作者: Gin_Q    时间: 2023-4-24 11:05

回复 3# ylmaster


    这个有点困难,你首先得下载一个Python3.7,9 版本,然后并安装,随后将代码保存为 1.py ,还需复制iplist文件到1.py目录中,最后在cmd里面输入 python 1.py
作者: ylmaster    时间: 2023-4-24 11:26

回复 4# Gin_Q


    太复杂了,批处理能搞定这个需求不?
作者: Gin_Q    时间: 2023-4-24 11:33

回复 5# ylmaster


             能搞,我搞不来!
作者: 77七    时间: 2023-4-25 16:59

  1. @echo off & setlocal enabledelayedexpansion
  2. rem 主要代码引用 https://zhangge.net/5050.html
  3. >"ping&telent_result.txt" echo IP地址 端口通断
  4. for /f "tokens=1-2" %%a in ('type "port_list.txt"') do (
  5. call :check_port "%%a" "%%b"
  6. )
  7. pause & exit
  8. :check_port
  9. set server_ip=%~1
  10. set serverport=%~2
  11. echo 正在ping !server_ip!
  12. >>ping.txt ping !server_ip!
  13. start /min cmd.exe /k "echo q|telnet -e 'q' !server_ip! !serverport! & exit"
  14. ping -n 3 127.1>nul
  15. echo 正在检测 !server_ip! 的 !serverport! 端口...
  16. (tasklist /fi "windowtitle eq Telnet !server_ip!" | find "cmd.exe" >nul && (
  17. echo !server_ip!:!serverport!端口异常
  18. (taskkill /f /t /fi "imagename eq cmd.exe" /fi "windowtitle eq Telnet !server_ip!") 1>nul
  19. ) || (
  20. echo !server_ip!:!serverport!端口正常
  21. ))>>"ping&telent_result.txt"
  22. goto :eof
复制代码

作者: ylmaster    时间: 2023-11-28 14:47

回复 7# 77七
谢谢大佬,感谢,感谢,感谢!
作者: wanghan519    时间: 2023-11-28 16:28

借宝地问一下,前两天需要扫描局域网端口是否开放,大概就是socket连接然后3秒超时,想并发
1. 用c#写比较慢,那个async写法好像还是个Task,是不是还受限于线程池
2. 用go确实很快,255个请求应该是同时并发,3秒后出所有结果,道听途说是goroutine是轻量级线程
3. 用py的asyncio,和go一样快,但py是单线程,这并发真的挺强,道听途说py的是无栈协程
4. 之后搜了一圈,发现c#的并发怎么写都是多线程都是受限于线程池,不知道是不是我孤陋寡闻
5. 然后搜c++,说是版本20以后才支持协程,以前版本用asio,网上搜的例子各写各的好像没统一的写法
6. 然后搜c,据说是有libaco libuv之类的库,比较成熟,就很好奇这三个c家族的相差这么大吗
7. 然后又搜到用rust代替go的,说是避免gc以及节省资源,但rust自己好像还没统一写法,tokio用的多,但async-std好像更有可能成为标准,而且好像协程加上生命周期有点超出我的能力了

总之就是想问下,有没有熟悉这方面的大佬给讲讲,上面的理解片面在哪错在哪该怎么用,多谢!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2