end的python学习

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


在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值