51dev.com IT技术开发者社区

51dev.com 技术开发者社区

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

Pythonphp学习阅读(12)2019-10-10 收藏0次评论

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]))

运行效果如下:

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秒

 

以上就是python模块之sys和subprocess以及编写简单的主机扫描脚本的全部内容,请多关注【51DEV】IT技术开发者社区。