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]))
运行效果如下:
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秒