Board logo

标题: [问题求助] Python怎样读取指定端口的IP [打印本页]

作者: 1073    时间: 2021-3-3 16:58     标题: Python怎样读取指定端口的IP

比如查看看当前3389远程端口的访问IP,批处理可以通过netstat命令获取到3389的访问IP,python应该怎么实现呢,


附批处理获取IP的命令
  1. for /f "tokens=3 delims= " %%i in ('netstat -n ^| find ":3389" ^| find "ESTABLISHED"') do (
  2. for /f "tokens=1 delims=:" %%m in ('echo %%i') do (
  3. set RemoteIP=%%m
复制代码

作者: Gin_Q    时间: 2021-3-3 18:53

  1. #!/usr/bin/env python3
  2. #coding=utf-8
  3. import os
  4. port = ":3389"
  5. for n in os.popen("netstat -n").read().split("\n"):
  6.     if n.find(port) > -1:
  7.         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

  1. #!/usr/bin/env python3
  2. #coding=utf-8
  3. import subprocess
  4. port = ":3389"
  5. proc = subprocess.Popen("netstat -n", stdout = subprocess.PIPE)
  6. try:
  7.     outs, errs = proc.communicate(timeout=15)
  8. except TimeoutExpired:
  9.     proc.kill()
  10.     outs, errs = proc.communicate()
  11. for n in outs.decode("GBk").split("\n"):
  12.     if n.find(port) > -1:
  13.         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 编辑

我又添加两行,成功了!
非常感谢您的指导!! 聊表心意。
  1. 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# 效率高很多
  1. using System;
  2. using System.IO;
  3. using System.Diagnostics;
  4. class CreateDir
  5. {
  6.     static void Main()
  7.     {   
  8.         string flag = ":3389";
  9.         
  10.         try
  11.         {
  12.             Process netstat = new Process();
  13.             netstat.StartInfo.FileName = "netstat";
  14.             // netstat.StartInfo.CreateNoWindow = true;
  15.             netstat.StartInfo.UseShellExecute = false;
  16.             netstat.StartInfo.RedirectStandardOutput = true;
  17.             netstat.StartInfo.Arguments = "-n";
  18.             
  19.             netstat.Start();
  20.             StreamReader reader = netstat.StandardOutput;
  21.             string result = reader.ReadToEnd();
  22.             foreach (var line in result.Split('\n'))
  23.             {
  24.                 if (line.IndexOf(flag) > -1)
  25.                 {
  26.                     Console.Write(line.Split(' ')[6].Split(':')[0]);
  27.                 }
  28.                
  29.             }
  30.         }
  31.         catch
  32.         {
  33.             Console.Write("Error");
  34.         }
  35.     }
  36. }
复制代码

作者: 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