标题: [网络连接] 批处理怎样从文本中读取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 版- import socket
- import pathlib
- import subprocess
-
-
- class IpTest(object):
-
- def __init__(self, ip_address_file:pathlib.Path, res_file:pathlib.Path) -> None:
-
- self.ip_address_file = ip_address_file
- self.ping_res_file = res_file
- self.ip_address_list = []
-
- def load_ip_address(self) -> None:
-
- self.ip_address_list.clear()
- with self.ip_address_file.open() as f:
- for ip in f.readlines():
- self.ip_address_list.append(ip.strip())
-
- def run_ip_test(self) -> None:
-
- pass
-
-
- class PingIP(IpTest):
-
- def __init__(self, ip_address_file: pathlib.Path, res_file: pathlib.Path) -> None:
- super().__init__(ip_address_file, res_file)
-
- def run_ip_test(self) -> None:
-
- res_file = self.ping_res_file.name
- if self.ping_res_file.exists():
- self.ping_res_file.unlink()
- for ip in self.ip_address_list:
-
- print(f"start: ping {ip} -n 2 >> {res_file}")
- subprocess.run(f"ping {ip} -n 2 >> {res_file}", shell=True)
- print(f"done: ping {ip} -n 2 >> {res_file}")
-
-
- class Telnent(IpTest):
-
- def __init__(self, ip_address_file: pathlib.Path, res_file: pathlib.Path) -> None:
- super().__init__(ip_address_file, res_file)
-
- @staticmethod
- def connect_ip(ip:str, port:int) -> bool:
-
- sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sck.settimeout(2) # 2 second
- try:
- sck.connect((ip,port))
- except:
- return False
- finally:
- sck.close()
- return True
-
-
- def run_ip_test(self) -> None:
-
- ip_ino:str
- with self.ping_res_file.open("w") as f:
- for ip_ino in self.ip_address_list:
- print(f"正在连接:{ip_ino}")
- ip,port = ip_ino.split(" ")
- if self.connect_ip(ip,int(port)):
- f.write(f"{ip_ino}端口正常\n")
- else:
- f.write(f"{ip_ino}端口异常\n")
-
-
-
- if __name__ == "__main__":
-
-
- p_set = []
- p_set.append(PingIP(pathlib.Path("ip_list.txt"), pathlib.Path("ping_result.txt")))
- p_set.append(Telnent(pathlib.Path("port_list.txt"), pathlib.Path("Telnent_result.txt")))
- for p in p_set:
- p.load_ip_address()
- 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
- @echo off & setlocal enabledelayedexpansion
- rem 主要代码引用 https://zhangge.net/5050.html
- >"ping&telent_result.txt" echo IP地址 端口通断
- for /f "tokens=1-2" %%a in ('type "port_list.txt"') do (
- call :check_port "%%a" "%%b"
- )
- pause & exit
- :check_port
- set server_ip=%~1
- set serverport=%~2
-
- echo 正在ping !server_ip!
- >>ping.txt ping !server_ip!
-
- start /min cmd.exe /k "echo q|telnet -e 'q' !server_ip! !serverport! & exit"
- ping -n 3 127.1>nul
- echo 正在检测 !server_ip! 的 !serverport! 端口...
- (tasklist /fi "windowtitle eq Telnet !server_ip!" | find "cmd.exe" >nul && (
- echo !server_ip!:!serverport!端口异常
- (taskkill /f /t /fi "imagename eq cmd.exe" /fi "windowtitle eq Telnet !server_ip!") 1>nul
- ) || (
- echo !server_ip!:!serverport!端口正常
- ))>>"ping&telent_result.txt"
- 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 |