Python编程--sys模块及OS模块简单用例

本文介绍了如何在Python中使用sys模块解析命令行参数,以及os模块进行文件存在性和访问权限的检查。通过示例代码展示了在安全扫描场景下,如何读取文本文件并检查文件是否存在的功能。同时,文章还演示了如何整合这两个模块,用于扫描远程服务器的端口并检测漏洞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python编程–sys模块及OS模块简单用例

sys模块

内置的sys模块使我们能访问到由Python解释器使用或维护的对象,其中包括标志、版本、整型数的最大尺寸、可用的模块、hook路径、标准错误/输入/输出的位置,以及调用解释器的命令行参数。比如,我们或许想要在运行时解析命令行参数。比如,漏洞扫描器:如果我们想把一个文本文件的文件名作为命令参数传递进来该怎么办?sys.argv列表中含有所有的命令行参数。第一个sys.argv[0]元素中的是Python脚本名称,列表中的其余参数则记录了之后所有的命令行参数。如果我们只传递一个额外的参数,sys.argv中应该包含两个元素,也就是sys.argv列表的长度为2。

import sys
if len(sys.argv) == 2:
  filename = sys.argv[1]
  print(f"[+] Reading Vulnerabilities From: {filename}" )

运行这段代码,我们看到代码成功地解析了命令行参数,如下图所示:

OS模块

内置的OS模块提供了丰富的适用于Mac、NT或Posix的操作系统的函数。这个模块允许程序独立地与操作系统环境、文件系统、用户数据库以及权限进行交互。上面的例子中,把一个文本文件名(vuln-banners.txt)作为参数传递进来,先检查一下该文件是否存在、当前用户是否有权限读取该文件,或许很有价值。如果其中任一条件不满足,就向用户显示一条相应的错误信息是很有帮助的。示例代码如下:

import os, sys
if len(sys.argv) == 2:    # 只传递一个文件名参数
    filename = sys.argv[1]   # 获取文件名,并赋值给filename
    if not os.path.isfile(filename):         # 判断文件是否存在
        print(f'[-] {filename} does not exist.')
        exit(0)
    if not os.access(filename, os.R_OK):          # 判断文件是否有访问权限
        print(f'[-] {filename} access denied.')
        exit(0)

    print(f'[+] Reading Vulnerables From: {filename}')

为验证代码,先尝试读取一个不存在的文件,脚本提示错误信息后,创建一个特定的文件名并成功读取其中的内容。最后,限制权限,脚本则正确地提示拒绝访问(access-denied)

+] Reading Vulnerablities From: vuln-banners.txt
(base) liuxiaowei@MacBook-Air hacker_python % python test.py vuln-banne.txt  
[-] vuln-banne.txt does not exist.
(base) liuxiaowei@MacBook-Air hacker_python % python test.py vuln-banners.txt
[+] Reading Vulnerables From: vuln-banners.txt
(base) liuxiaowei@MacBook-Air hacker_python % python test.py vuln-banners.txt 
[-] vuln-banners.txt access denied.

现在整合这两个模块的应用,示例代码如下:

import socket
import os
import sys

# 定义返回banner函数,参数为(ip,port)
def retBanner(ip, port):
    try:
        socket.setdefaulttimeout(2)
        s = socket.socket()
        s.connect((ip, port))
        banner = s.recv(1024)
        return banner
    
    except:
        return
    
# 定义测试漏洞函数,参数为banner,filename
def checkVulns(banner, filename):
    with open(filename, 'r') as f:
        for line in f.readlines():
            if line.strip('\r\n') in banner:
                print(f'[+] Server is vulnerable: {banner.strip("\n")}')
                

def main():
    if len(sys.argv) == 2:
        filename = sys.argv[1]
        if not os.path.isfile(filename):
            print(f'[-] {filename} does not exist.')
            exit(0)
            
        if not os.access(filename, os.R_OK):
            print(f'[-] {filename} access denied.')
            exit(0)
            
    else:
        print('[-] Usage: ' + str(sys.argv[0]) + ' <vuln filename>')
        exit(0)
        
        portLst = [21, 22, 25, 80, 110, 443]
        for i in range(147, 150):
            ip = '192.168.31.' + str(i)
            for port in portLst:
                banner = retBanner((ip, port))
                if banner:
                    print('[+] '+ ip + ': ' + banner)
                    checkVulns(banner, filename)
                    
if __name__ == '__main__':
    main()
                            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce_xiaowei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值