欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python模块之sys和subprocess以及编写简单的主机扫描脚本

程序员文章站 2023-02-21 09:32:21
python模块之sys和subprocess以及编写简单的主机扫描脚本 1.sys模块 sys.exit(n) 作用:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用 ......

python模块之sys和subprocess以及编写简单的主机扫描脚本

1.sys模块

  sys.exit(n)  作用:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)

  sys.path   作用:获取指定模块搜索路径的字符串集合

  sys.platform: 获取当前系统平台

  sys.argv  在外部向程序内部传递参数

2.subprocess模块(sys模块的升级版,常用)

  subprocess.run()   作用:运行命令,返回命令执行的结果(python3.5以后的版本才会有这个命令)

  subprocess.call()   作用:执行命令,返回命令的状态,0或者非0,0表示执行成功

  subprocess.getstatusoutput()    作用:接收字符串形式的命令,返回元组形式,第一个元素是执行状态,第二个是命令结果

  subprocess.check_output()     作用:执行命令,并且返回二进制结果

3.简单的主机扫描脚本编写

 

2.subprocess模块 

import subprocess
#subprocess.run()
#作用:运行命令,返回命令执行的结果(python3.5以后的版本才会有这个命令)
#r1=subprocess.run("dir",shell=true) #subprocess想调用cmd内置的命令,需要加上参数shell=true
#r2=subprocess.run("ping www.baidu.com") #ping程序是一个单独的程序,subprocess可以直接调用
#print(r1)
#print(r2)
#subprocess.call()
#作用:执行命令,返回命令的状态,0或者非0,0表示执行成功,1表示执行失败
#r1=subprocess.call("dir",shell=true)
#r2=subprocess.call("ping 8.8.8.8 -n 1")
#print(r1)
#print(r2)
#subprocess.getstatusoutput()
#作用:接收字符串形式的命令,返回元组形式,第一个元素是执行状态,第二个是命令结果
r1=subprocess.getstatusoutput("dir")
print(r1)
r2=subprocess.getstatusoutput("dir1")
print(r2)
r3=subprocess.getstatusoutput("ping 1.1.1.1")
print(r3)
#subprocess.check_output()
#作用:执行命令,并且返回二进制结果
r1=subprocess.check_output("dir",shell=true)
print(r1)

3.简单的主机扫描脚本编写

import sys
import os
def ping(net,start=50,end=200,n=1,w=10):
    for i in range(start,end+1):
        ip=net+"."+str(i)
        command="ping %s -n %d -w %d >nul"%(ip,n,w)     #>nul 不显示ping返回的信息
        print(ip,("通","不通")[os.system(command)])
        #print(os.popen(command).read())

#print(sys.argv)
#print(len(sys.argv))

if len(sys.argv) not in [2,4,6]:
    print("参数输入错误!")
    print("运行示例:")
    print("test01.py 123.125.114")
    print("test01.py 123.125.114 30 50")
    print("test01.py 123.125.114 30 50 4,5")
    print("语法:test01.py net startip,endip,count timeout")
elif len(sys.argv)==2:
    net=sys.argv[1]
    ping(net)
elif len(sys.argv)==4:
    net=sys.argv[1]
    ping(net,start=int(sys.argv[2]),end=int(sys.argv[3]))
else:
    net=sys.argv[1]
    ping(net,start=int(sys.argv[2]),end=int(sys.argv[3]),n=int(sys.argv[4]),w=int(sys.argv[5]))

运行效果如下:

python模块之sys和subprocess以及编写简单的主机扫描脚本

4.用subprocess模块编写

代码如下:

import sys
import subprocess
import time
def ping(net,start=100,end=200,n=2,w=5):
    for i in range(start,end+1):
        ip=net+"."+str(i)
        command="ping %s -n %d -w %d"%(ip,n,w)
        print(ip,("通","不通")[subprocess.call(command,stdout=open("nul","w"))]) #stdout=open("nul","w") #不显示命令执行返回的结果
t1=time.time()
if len(sys.argv)!=2:
    print("参数输入错误!")
    print("运行示例:")
    print("test01.py 123.125.114")
elif len(sys.argv)==2:
    net=sys.argv[1]
    ping(net)
t2=time.time()
print("程序耗时%f秒!"%(t2-t1))   #195.091611秒