python执行cmd命令中包含中文时命令执行失败的解决办法

问题根因:

操作系统是Windows,IDE是默认UTF-8编码的。
现在想通过cmd打开具有中文路径的文件,用os.system(command)打不开,返回的错误是乱码看不懂。
cmd的默认编码是cp936,也就是gb2312,我尝试改为utf-8。

解决办法:

前提要pychram的文件编码要设置成gbk,亲测有用,设置成utf-8就执行失败。

将你的命令也就是字符串编码成gb2312,执行结果貌似没用,使用python执行sqlmap批量扫描时,文件路径包含中文,命令启动执行失败。

#_*_conding:utf-8
import os
import shutil
import re
import locale
class  SearchFile(object):

    def __init__(self,path='.'):
        self._path=path
        self.abspath=os.path.abspath(self._path) # 默认当前目录

    #搜索包含keword关键字的文件完整路径
    def findfile(self,keyword,root1):
        filelist=[]
        for root,dirs,files in os.walk(root1):
            print(len(files),root,files)
            for name in files:
                filelist.append(os.path.join(root, name))

        print('...........................................')
        for path in filelist:
            if os.path.isfile(path) :
                if keyword in os.path.split(path)[1] :#如果你要搜索的关键字存在
                    if os.path.getsize(path)==0:#如果这个文件的大小为0,则删除对应的上级文件夹,否则把文件路径打印出来
                        shutil.rmtree(os.path.split(path)[0])
                    else:
                        print('疑似存在注入的SQLMAP执行结果的log文件路径:', path)  # 绝对路径

    #将整理后的存在注入的网站的target文件的内容整合(待完善)
    def InterFile(self,filepath, b="target"):
        filepath_new=filepath+'/'+'疑似存在注入汇总.txt'
        p = open(filepath_new,'w')#先将要汇总的文件先清空
        p.write("")
        p.close()
        filelist = []
        for root, dirs, files in os.walk(filepath):
            for name in files:
                filelist.append(os.path.join(root, name))

        print('...........................................')
        for path in filelist:
            if os.path.isfile(path) and b in os.path.split(path)[1]:
                fopen = open(path, 'r',encoding='UTF-8')
                fileread = fopen.readlines()
                fopen.close()
                pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')  # 匹配模式

                for line in fileread:
                    #print("这是那个链接:",line)
                    url = re.findall(pattern, line)
                    #print("这个url:", url)
                    p=open(filepath_new,'a')

                    if url[0]!="":
                        p.write(url[0]+'\r')
                    else:
                        p.write(url[1] + '\r')
                    p.close()

    #启动执行sqlmap批量扫描,文件中存在中文,命令执行有编码问题
    def Cmd_Sqlmap(self,path,b="疑似存在注入汇总.txt"):
        filename = os.path.join(path,b)
        os.chdir("E:\Python27\sqlmap")
        cmd="python sqlmap.py -m "+filename+' --random-agent --level=3 --threads="3" --batch --users --tables'
        print(cmd)
        p = os.popen(cmd.encode('gb2312').decode('gb2312'))
        print(p.read())


    def __call__(self):
        while True:
            workpath=input('你想更改运行目录吗?回车直接退出 Y/N:')
            if(workpath == ''):
                break
            if workpath=='y' or workpath=='Y':
                root=self.abspath   # 把当前工作目录作为工作目录
                print('当前工作目录:',root)
                dirlist=os.listdir()  # 列出工作目录下的文件和目录
                print(dirlist)
            else:
                root=input('请输入你要获取的文件目录:')
                print('当前工作目录:',root)
            keyword=input('输入你要搜索的关键字符:')
            if(keyword==''):
                break
            self.findfile(keyword,root) # 查找带指定字符的文件
            print("文件外的root:",root)
            self.InterFile(root)
            self.Cmd_Sqlmap(root)


if __name__ == '__main__':
    search = SearchFile()
    search()

 

 

 

command = XXX
os.system(command.encode('gb2312'))
#然后报错说byte不能转为str
#这时你再decode一下
os.system(command.encode('gb2312').decode('gb2312')) # 有encode就有decode
#这样就行了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,可以使用多种方法执行cmd命令。其一种方法是使用os.system(cmd)函数。这个函数可以简单地执行cmd命令,但无法获取控制台输出的内容,只返回命令的退出状态。如果命令执行成功,返回值为0。例如,可以使用以下代码执行cmd命令并获取返回值: ```python import os retValue = os.system("cmd命令") print(retValue) ``` 另一种方法是使用subprocess模块。subprocess模块提供了更高级、更强大的功能来执行命令,并且可以获取控制台输出的内容。可以使用subprocess.run()函数执行指定的命令,并等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。例如,可以使用以下代码执行cmd命令并获取输出: ```python import subprocess result = subprocess.run("cmd命令", shell=True, capture_output=True, text=True) print(result.stdout) ``` 请注意,上述代码的"cmd命令"应替换为您要执行的实际命令。使用subprocess模块可以更灵活地执行和处理命令,因此在大多数情况下,推荐使用subprocess模块来执行cmd命令。 #### 引用[.reference_title] - *1* *3* [Python 执行cmd命令的3种方法简单示例,并获取返回信息、执行命令结果(成功 or 失败)](https://blog.csdn.net/qq_33704787/article/details/124755072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [一文看懂python如何执行cmd命令](https://blog.csdn.net/Rocky006/article/details/131154694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值