Python os.popen() 方法
os.popen() 方法用于从一个命令打开一个管道。
popen()方法语法格式如下:
os.popen(command[, mode[, bufsize]])
command -- 使用的命令。
mode -- 模式权限可以是 'r'(默认) 或 'w'。
bufsize -- 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。
os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被调用。而os.system不同,它只是调用,调用完后自身退出,可能返回个0吧
Python splitlines()方法
splitlines()方法语法:
str.splitlines([keepends])
keepends – 在输出结果里是否保留换行符(’\r’, ‘\r\n’, \n’),默认为 False,不包含换行符,如果为 True,则保留换行符。
from optparse import OptionParser
import os
import re
def main():
parser = OptionParser("Usage:%prog -i <target host>") # 输出帮助信息
parser.add_option('-i', type='string', dest='IP', help='specify target host')
(options, args) = parser.parse_args()
ip = options.IP
ttl_scan(ip)
def ttl_scan(ip):
ttlstrmatch = re.compile(r'ttl=\d+')
ttlnummatch = re.compile(r'\d+')
result = os.popen("ping -c 1 " + str(ip))
res = result.read()
for line in res.split('\n'):
result = ttlstrmatch.findall(line)
if result:
ttl = ttlnummatch.findall(result[0])
if int(ttl[0]) <= 64:
print("%s is Linux/UNIX" % ip)
else:
print("%s is Windows" % ip)
else:
pass
if __name__ == "__main__":
main()
import nmap
import sys
import time
from optparse import OptionParser
from threading import Thread
from scapy.all import *
def ttl_scan(ip):
packet = IP(dst=ip)/ICMP()
result = sr1(packet,timeout=1,verbose=0)
if result is None:
pass
elif int(result[IP].ttl) <= 64: # 判断目标主机响应包中TTL值是否小于等于64
print ("%s is Linux/Unix"%ip) # 是的话就为linux/Unix
else:
print("%s is Windwows"%ip) # 反之就是linux
def nmap_scan(ip):
nm = nmap.PortScanner()
try:
result = nm.scan(hosts=ip,arguments='-O') #调用nmap执行-O扫描操作系统
os = result["scan"][ip]['osmatch'][0]['name'] # 从返回值里通过切片提取出操作系统版本
time.sleep(0.1)
print(ip,os)
except:
pass
def main():
parser = OptionParser("Usage:%prog -i <target host> -n <network> or -t ttl_scan") # 输出帮助信息
parser.add_option('-i',type='string',dest='tgtIP',help='specify target host') # 获取ip地址参数
parser.add_option('-t', type='string', dest='ttl', help='input -t ttl') # 是否使用ttl模块扫描
parser.add_option('-n',type="string",dest='tgtNetwork',help='specify target host') #获取网段信息
options,args = parser.parse_args()
# 实例化用户的参数
tgtip = options.tgtIP
Network = options.tgtNetwork
TTL = options.ttl
if tgtip is None and Network is None: # 判断文件是否存在
print(parser.usage)
sys.exit()
if tgtip is not None: # 单个地址时执行的操作
if TTL: # 判断是否调用ttl扫描
ttl_scan(tgtip)
else:
nmap_scan(tgtip)
if Network:
prefix = Network.split(".")[0]+'.'+Network.split(".")[1]+'.'+ Network.split(".")[2]+'.' # 以点为分割提取ip地址前三位
if TTL : # 判断是否调用ttl扫描
for i in range(1, 255):
ip = prefix + str(i) # 结合ip地址前缀生成网段扫描所需ip
t = Thread(target=ttl_scan,args=(ip,))
t.start()
time.sleep(0.1)
else:
for i in range(1, 255):
ip = prefix + str(i)
t = Thread(target=nmap_scan,args=(ip,))
t.start()
if __name__ == "__main__":
main()