标题: [问题求助] Python怎样读取指定端口的IP [打印本页]
作者: 1073 时间: 2021-3-3 16:58 标题: Python怎样读取指定端口的IP
比如查看看当前3389远程端口的访问IP,批处理可以通过netstat命令获取到3389的访问IP,python应该怎么实现呢,
附批处理获取IP的命令- for /f "tokens=3 delims= " %%i in ('netstat -n ^| find ":3389" ^| find "ESTABLISHED"') do (
- for /f "tokens=1 delims=:" %%m in ('echo %%i') do (
- set RemoteIP=%%m
复制代码
作者: Gin_Q 时间: 2021-3-3 18:53
- #!/usr/bin/env python3
- #coding=utf-8
-
- import os
-
-
- port = ":3389"
- for n in os.popen("netstat -n").read().split("\n"):
- if n.find(port) > -1:
- print(n.split(":")[0].split(" ")[-1])
复制代码
作者: 1073 时间: 2021-3-3 21:17
Gin_Q 发表于 2021-3-3 18:53
太感谢了!! 找了好几天, 代码真精炼
作者: 1073 时间: 2021-3-4 16:12
回复 2# Gin_Q
老师碰到一个问题再请教一下,把这个脚本打包成exe运行没问题,
但如果打包加隐藏参数,隐藏窗口打包(pyinstaller -w -F ***.py),
运行程序就会报错【Failed to execute script ts】
网上搜了下有篇文章说用【subprocess.popen】代替【os.popen】,(https://cloud.tencent.com/developer/article/1739901)
但我能力有限看不太明白,用subprocess.popen替换掉执行总是出错,您能再指导下吗
作者: Gin_Q 时间: 2021-3-4 16:34
回复 4# 1073
为什么要隐藏控制台,这个本来就是控制台程序
作者: Gin_Q 时间: 2021-3-4 16:36
- #!/usr/bin/env python3
- #coding=utf-8
-
- import subprocess
-
-
- port = ":3389"
-
- proc = subprocess.Popen("netstat -n", stdout = subprocess.PIPE)
- try:
- outs, errs = proc.communicate(timeout=15)
- except TimeoutExpired:
- proc.kill()
- outs, errs = proc.communicate()
-
- for n in outs.decode("GBk").split("\n"):
- if n.find(port) > -1:
- print(n.split(":")[0].split(" ")[-1], end="", flush=True)
复制代码
作者: 1073 时间: 2021-3-4 16:50
回复 1073
为什么要隐藏控制台,这个本来就是控制台程序
Gin_Q 发表于 2021-3-4 16:34
感谢您的答复,本意是做一个无任何界面的程序,不想看到黑窗;
我把您修改的脚本打包后还是报错,只要加了-w隐藏窗口就报错,也不知道问题在哪
作者: Gin_Q 时间: 2021-3-4 17:20
回复 7# 1073
不显示,怎么得到ip
作者: 1073 时间: 2021-3-4 17:21
本帖最后由 1073 于 2021-3-4 17:32 编辑
我又添加两行,成功了!
非常感谢您的指导!! 聊表心意。- stderr=subprocess.STDOUT,stdin=subprocess.PIPE
复制代码
作者: Gin_Q 时间: 2021-3-4 17:35
回复 9# 1073
我只知道STARTUPINFO这个参数可以隐藏窗口,或者一些没有给定nCmdShow参数的GUI程序
作者: Gin_Q 时间: 2021-3-5 21:34
回复 9# 1073
C# 效率高很多- using System;
- using System.IO;
- using System.Diagnostics;
-
- class CreateDir
- {
- static void Main()
- {
- string flag = ":3389";
-
- try
- {
- Process netstat = new Process();
- netstat.StartInfo.FileName = "netstat";
- // netstat.StartInfo.CreateNoWindow = true;
- netstat.StartInfo.UseShellExecute = false;
- netstat.StartInfo.RedirectStandardOutput = true;
- netstat.StartInfo.Arguments = "-n";
-
- netstat.Start();
- StreamReader reader = netstat.StandardOutput;
- string result = reader.ReadToEnd();
- foreach (var line in result.Split('\n'))
- {
- if (line.IndexOf(flag) > -1)
- {
- Console.Write(line.Split(' ')[6].Split(':')[0]);
- }
-
- }
- }
- catch
- {
- Console.Write("Error");
- }
- }
- }
复制代码
作者: xczxczxcz 时间: 2021-3-8 11:25
回复 11# Gin_Q
昨晚无意中测试netcore5.0时,发现可以编译成独立的`本地二进制码'好爽,然后在虚拟机闩win7 win8(都是未安装netcore,netframework也是系统默认版本)测试,可以直接运行编译后的程序,速度飞快。网上查了下,说是编译时它会谝译成IL码和本地码,估计编译IL码是为了保险,以前netcore3.1时编译独立带有本地码时总是失败。然后用de4dot ilspy一些netcore反编译程序查看,看不到原代码。
C# 调bat对速度影响也不小,查端口可以用system.net和syetem.net.networkinformation类查。
作者: Gin_Q 时间: 2021-3-8 14:41
本帖最后由 Gin_Q 于 2021-3-8 14:55 编辑
回复 12# xczxczxcz
非常感谢指点。正在学习中。。。 没有环境也能跑起来吗?
作者: xczxczxcz 时间: 2021-3-8 18:33
回复 13# Gin_Q
是的,不用环境可以直接运行,就是文件较大。
刚才测试发现: xp 系统不支持。
WPF可以编绎,但不能运行,需编译成非独立的。有可能哪里设置不对,再折腾一下(没有添加外部引用)的状况,等微软进一步完善。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |