返回列表 发帖

[问题求助] 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=%%mCOPY

#!/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])COPY
QQ:1972544783

TOP

Gin_Q 发表于 2021-3-3 18:53



    太感谢了!! 找了好几天, 代码真精炼

TOP

回复 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替换掉执行总是出错,您能再指导下吗

TOP

回复 4# 1073


    为什么要隐藏控制台,这个本来就是控制台程序
QQ:1972544783

TOP

#!/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)COPY
QQ:1972544783

TOP

回复  1073


    为什么要隐藏控制台,这个本来就是控制台程序
Gin_Q 发表于 2021-3-4 16:34



    感谢您的答复,本意是做一个无任何界面的程序,不想看到黑窗;
    我把您修改的脚本打包后还是报错,只要加了-w隐藏窗口就报错,也不知道问题在哪

TOP

回复 7# 1073


    不显示,怎么得到ip
QQ:1972544783

TOP

本帖最后由 1073 于 2021-3-4 17:32 编辑

我又添加两行,成功了!
非常感谢您的指导!! 聊表心意。
stderr=subprocess.STDOUT,stdin=subprocess.PIPECOPY

TOP

回复 9# 1073


    我只知道STARTUPINFO这个参数可以隐藏窗口,或者一些没有给定nCmdShow参数的GUI程序
QQ:1972544783

TOP

回复 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");
        }
    }
}COPY
QQ:1972544783

TOP

回复 11# Gin_Q


    昨晚无意中测试netcore5.0时,发现可以编译成独立的`本地二进制码'好爽,然后在虚拟机闩win7  win8(都是未安装netcore,netframework也是系统默认版本)测试,可以直接运行编译后的程序,速度飞快。网上查了下,说是编译时它会谝译成IL码和本地码,估计编译IL码是为了保险,以前netcore3.1时编译独立带有本地码时总是失败。然后用de4dot ilspy一些netcore反编译程序查看,看不到原代码。
   C# 调bat对速度影响也不小,查端口可以用system.net和syetem.net.networkinformation类查。
QQ: 458609586
脚本优先 [PowerShell win10]

TOP

本帖最后由 Gin_Q 于 2021-3-8 14:55 编辑

回复 12# xczxczxcz


    非常感谢指点。正在学习中。。。 没有环境也能跑起来吗?
QQ:1972544783

TOP

回复 13# Gin_Q

是的,不用环境可以直接运行,就是文件较大。
刚才测试发现:  xp 系统不支持。
WPF可以编绎,但不能运行,需编译成非独立的。有可能哪里设置不对,再折腾一下(没有添加外部引用)的状况,等微软进一步完善。
QQ: 458609586
脚本优先 [PowerShell win10]

TOP

返回列表