作者 主题: 分享一个自己编写的脚本 进程监听端口列表 Windows平台  (阅读 11621 次)

暗香

  • 新手上路
  • *
  • 帖子: 8
  • 人气: 1
分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 于: 十二月 16, 2011, 11:33:47 下午 »
分享一个自己编写的脚本,用于查看进程都监听了哪些端口。
代码如下:
程序代码: [选择]
from subprocess import Popen as popen
import re
import os

fname = 'tmp.txt'
fout = open(fname, 'wb')
p = popen('netstat -nao', stdout=fout)
p.wait()
p = popen('tasklist', stdout=fout)
p.wait()
fout.close()

fin = open(fname, 'rb')
buf = fin.read()
fin.close()
os.remove(fname)

p1 = ':(\d{1,5}) +?.+?LISTENING +?(\d{1,5})'
p2 = '(.+?)  +?(\d{1,5}) Console|(.+?)  +?(\d{1,5}) Services'

ports = {}
for i in re.finditer(p1, buf):
    _port = i.group(1)
    _pid = i.group(2)
    if not ports.has_key(_pid):
        ports[_pid] = [_port]
    else:
        ports[_pid].append(_port)
names = {}
c = 0
for i in re.finditer(p2, buf):
    _name = i.group(1)
    _pid = i.group(2)
    if _name:
        names[_pid] = _name
    else:
        _name = i.group(3)
        _pid = i.group(4)
        names[_pid] = _name

print '-' * 79
for d in names:
    if ports.has_key(d):
        print 'Process', names[d], '(pid %s)' % d, 'ports:', ', '.join(ports[d])
print '-' * 79
raw_input('Press ENTER key to continue ...')

使用管道,替换掉前边创建文件,读写文件的过程。
程序代码: [选择]
buf = ''
p = popen('netstat -nao', bufsize=1024, stdout=pipe)
buf += p.stdout.read()
p = popen('tasklist', bufsize=1024, stdout=pipe)
buf += p.stdout.read()

感谢mrshelly的提示。
« 最后编辑时间: 十二月 20, 2011, 07:37:18 下午 作者 暗香 »

暗香

  • 新手上路
  • *
  • 帖子: 8
  • 人气: 1
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #1 于: 十二月 16, 2011, 11:36:24 下午 »
主要的思路是综合Windows下的两个命令“netstat”和“tasklist”的输出,分析出本机上的进程都监听了哪些端口。

暗香

  • 新手上路
  • *
  • 帖子: 8
  • 人气: 1
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #2 于: 十二月 16, 2011, 11:49:30 下午 »
原打算使用StringIO对象,但是popen报错,说StringIO对象没有fileno属性,只能替换成文件对象。不知道各位有没有可以替代的方法,使用内存,不用在磁盘上生成临时文件。

mrshelly

  • 唐僧初段
  • *****
  • 帖子: 944
  • 人气: 2
  • OpenERP python,php,js 谢谢
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #3 于: 十二月 18, 2011, 02:00:11 下午 »
不错支持一下....

Tags 是用英文","分隔的...
另:  请参考:
http://docs.python.org/library/tempfile.html
&
http://docs.python.org/library/stringio.html

暗香

  • 新手上路
  • *
  • 帖子: 8
  • 人气: 1
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #4 于: 十二月 20, 2011, 02:19:42 下午 »
谢谢。有没有办法把popen出的进程输出重定向到内存,而不用在磁盘建立临时文件?

mrshelly

  • 唐僧初段
  • *****
  • 帖子: 944
  • 人气: 2
  • OpenERP python,php,js 谢谢
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #5 于: 十二月 20, 2011, 04:20:21 下午 »
程序代码: [选择]
...
>>> pop = subprocess.Popen('cmd /c dir', stdin=subprocess.PIPE, stdout=subproces
s.PIPE, close_fds=False)
>>> print pop.stdout.read()
...

digitalsatori

  • 论坛管理员
  • 唐僧初段
  • *****
  • 帖子: 897
  • 人气: 49
    • 上海先安科技
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #6 于: 十二月 20, 2011, 04:27:41 下午 »
试试psutil 模块,你可以更优雅的实现你要的功能,而且更重要的是它是夸平台的。
OpenERP高级实施顾问
上海先安科技 (http://www.openerp.cn)
tony AT openerp.cn
021 50323731

暗香

  • 新手上路
  • *
  • 帖子: 8
  • 人气: 1
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #7 于: 十二月 20, 2011, 06:08:12 下午 »
程序代码: [选择]
...
>>> pop = subprocess.Popen('cmd /c dir', stdin=subprocess.PIPE, stdout=subproces
s.PIPE, close_fds=False)
>>> print pop.stdout.read()
...

谢谢你的提示,通过使用管道很好的处理了这个问题。

暗香

  • 新手上路
  • *
  • 帖子: 8
  • 人气: 1
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #8 于: 十二月 20, 2011, 06:34:16 下午 »
试试psutil 模块,你可以更优雅的实现你要的功能,而且更重要的是它是夸平台的。

谢谢你的建议,看了psutil包的介绍,功能很强大。在系统管理上会很有用。

mrshelly

  • 唐僧初段
  • *****
  • 帖子: 944
  • 人气: 2
  • OpenERP python,php,js 谢谢
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #9 于: 十二月 21, 2011, 11:12:02 上午 »
psutil 官方没有放出 编译版本 相当麻烦啊...

自己编译也很麻烦...

暗香

  • 新手上路
  • *
  • 帖子: 8
  • 人气: 1
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #10 于: 十二月 21, 2011, 03:02:59 下午 »
psutil 官方没有放出 编译版本 相当麻烦啊...

自己编译也很麻烦...

现在已放出了编译版本,首页上有2.7和3.2的下载链接。

mrshelly

  • 唐僧初段
  • *****
  • 帖子: 944
  • 人气: 2
  • OpenERP python,php,js 谢谢
Re: 分享一个自己编写的脚本 进程监听端口列表 Windows平台
« 回复 #11 于: 十二月 21, 2011, 10:30:54 下午 »
看到了. 也有2.4,2.5的下载链接.

晚上试了一下. 是个蛮强大的扩展... 很棒..... 看来可以用OE做一些服务器管理的模块了....