python常用操作

基础操作

1.创建虚拟环境

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.7

sudo apt-get install virtualenv
virtualenv -p /usr/bin/python2.7 venv

2. 字符串操作

a = 'hello word'
b = a.replace('word','python')  # 将word替换为python

3. try的用法

try:
    f1 = open(jobpath + "/" + i, "r")
except Exception as e:  # 文件可能已经被删除
    print(e)

4. 获取数组长度

    len(array)

5. dict的用法

if key in dict:
    dic[key] = value
for k, v in dict.items():

6. split(" ")的结果。空格之前是空,所以会保留一个空字符("")。

print(" <0x00000000004307be> [func:output file: line:0 module:/home/ybxm/myClusterfuzzClinet/client1/jobprojects/Honggfuzz/1-21-honggfuzz/badcode1]")

['', '<0x00000000004307be>', '[func:output', 'file:', 'line:0', 'module:/home/ybxm/myClusterfuzzClinet/client1/jobprojects/Honggfuzz/1-21-honggfuzz/badcode1]']

7. pip3安装

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py  # 下载指定版本的get-pip.py
python3 get-pip.py

 

文件操作

1. os.remove('a.txt')    # 删除文件

2. os.chdir(job_path) # 进入指定目录中

3. os.listdir(crash_path)   # 列出crash_path目录下的文件列表

4. os.path.exists("/home/ybxm/123.txt")    # 判断文件是否已经存在,也可以是路径

5. os.mkdir("./test")     # 创建目录

5. os.path.isfile(save_infolog_path)    # 文件是否已经存在

6. os.rename(old_file,new_file) 

7.  文件的打开与读取

f1 = open(file1, "r")    # r只读,r+读写(从头开始覆盖读写);w(只写,文件没有就创建,有就删除重新创建),w+(读写);a附加写方式打开,不可读;a+: 附加读写方式打开。

print( f1.read() )    # f1.readline(), 读取单行内容

f1.close()

f2 = open(info_path, "w+") # 将读取到的文件信息作为日志信息存入info目录中; 覆盖原有的内容

f2.write("123")

f2.close()


f3 = open(filename, "rb")    # 打开模式选择二进制读取"rb"。

8. 编码与解码

u = '中文' # 指定字符串类型对象u

str1 = u.encode('gb2312') # 以gb2312编码对u进行编码,获得二进制类型对象

>>> print(str1)

b'\xd6\xd0\xce\xc4'

u1 = str1.decode('gb2312')  # 以gb2312编码对字符串str进行解码,获得字符串类型对象

>>> print('u1')

'中文'

/* qsym中用法错误,我以为输入的参数是测试用例的内容,但其实是测试用例所在的路径*/

 

进程创建

1.  进程创建和子进程信息输出

import subprocess
import psutil
os.chdir(job_path)  # 必须切换到可执行文件所在的目录下
cmd = (target_path + " < " + crash_path)
with open("./reproduce_result.txt", "ab") as out:  # 追加,文件不存在就创建
    pro = subprocess.Popen(cmd, shell=True, stdout=out, stderr=out)  # 将结果输出到文件
pro = subprocess.Popen(start_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  # 将结果输出到shell屏幕上

2.  进程创建中shell = True的作用

1. shell=True参数会让subprocess.Popen接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,
subprocess.Popen只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数。如下: 
   >>>args = ['/bin/cat', '-input', 'test.txt', '-output', 'diege.txt', '-cmd', "echo '$MONEY'"]
   >>>p=subprocess.Popen(args)

3. 进程的结束

fp = subprocess.Popen.poll(pro)
poll的返回值fp: 0正常结束, 1sleep, 2子进程不存在, none正在运行
for proc in psutil.process_iter():  # 通过进程名的方式来kill进程
    if proc.name() == execname:  # 不同的模糊测试实例该名字不一样
        proc.terminate()
        print("libfuzz process end successfully!")
        break

 

 

 

 

服务器端的请求与下载

1. 子节点与后端2通信

子节点向后端2请求job:

data = [("nodename", nodename), ("ip", ip), ("cores", cores), ("mem", mem)]
url = url_get_job + urllib.parse.urlencode(data)  # url_get_job = "http://localhost:5001/cget/getjob?"
api_result = req.urlopen(url).read()
result = json.loads(api_result)  # 将后端2返回的job信息转化为json格式

后端2返回job信息:

name = request.args.get("nodename")
ipaddr = request.args.get("ip")
men = request.args.get("mem")
corenum = request.args.get("cores")
return jsonify({"exist": "no"})

子节点向后端2请求固件:

url_get_arch = "http://localhost:5001/cget/getarch?"
data = [("type", type), ("name", name)]
url = url_get_arch + urllib.parse.urlencode(data)
f = req.urlopen(url)
data = f.read()  # 读取文件内容

后端2返回固件:

type = request.args.get("type")
name = request.args.get("name")
return send_from_directory(r"" + path + "", filename=name+".zip", as_attachment=True)

子节点提交漏洞文件:

url_post_crash = "http://localhost:5001/cpost/postcrash"
data = {"nodename": nodename, "jobname": jobname, "crashnum":\
        (jobname + "_" + nodename + "_" + "crash_" + str(crash_number))}
res = requests.post(url_post_crash, files={"file": open(crash_path + i, 'rb')}, data=data)
print(res.text)  # res.text = "上传漏洞用例成功!"

后端2接收文件:

file = request.files.get('file')
jobname = request.form["jobname"]
crashnum = request.form["crashnum"]
return "上传漏洞用例成功!"

 

前端传递任务信息与固件给后端1:

vue.js页面

let formData = new FormData();

formData.append("file", this.form.file);

formData.append("jobname", this.form.jobname);

formData.append("fuzz", this.form.fuzz);

formData.append("botnum", this.form.botnum);

formData.append("runtime", this.form.runtime);

formData.append("exec", this.form.exec);

uplodaJobInfo(formData).then(resp => {

  this.$message(resp.data.msg); // 弹窗显示“任务创建从成功”

  this.$router.push({ path: "/joblist" });

})

api页面:

import request from '@/utils/request'

export const uplodaJobInfo = (formData) => {

return request.post('/createjob/', formData, {

headers: {

'Content-Type': 'multipart/form-data'

}

})

}

后端1接收文件:

 file = request.files.get('file')
    # file.read()
    job_info = request.form.to_dict()
    jobname = job_info.get("jobname")
    fuzz = job_info.get("fuzz")
    botnum = job_info.get("botnum")
    runtime = job_info.get("runtime")
    execname = job_info.get("exec")

 return jsonify({
        'msg': '任务创建成功'
    }), 200

 

Python图表绘制

#!/usr/bin/python
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
 
# y1=[1, 4, 9, 16, 25]
# y2=[1, 6, 10, 26, 35]
# x = range(0, 5)
f1 = "output-pdftotext-1h-aflfast_qsymold" + "/master/plot_data"
f2 = "output-pdftotext-1h-aflfast_qsymchange" + "/slave1/plot_data"
x = range(0, 61, 5)

def get_y(f1):
    tmp_x = 0
    y1 = []
    f = open(f1, "r") 
    lines =  f.read().split("\n")
    start_time = lines[1].split(", ")[0]
    # print(start_time)
    for i in range(1, len(lines)-1):
        res = lines[i].split(", ")
        # print("res[0] " + res[0] + " start_time " + start_time)
        difftime = int(res[0]) - int(start_time)
        if difftime >= tmp_x:
            y1.append(int(res[7]))
            tmp_x += 300
            # print(difftime)
            # print(tmp_x)
        if i == len(lines)-2 and tmp_x <= 3600:
            y1.append(int(res[7]))
    print(tmp_x)
    return y1


y1 = get_y(f1)
y2 = get_y(f2)
plt.plot(x, y1, marker='o', mec='b', label='qsym-old')
plt.plot(x, y2, marker='o', mec='y', label='qsym-new')

plt.title('pdftotext crashes in queue over time')
plt.xlabel('time')
plt.ylabel('crash num')
plt.legend()  # pic example
plt.show()



"""
for i in range(0, 5):
    plt.text(x[i], y1[i]-1, (x[i], y1[i]-1), fontsize=1, label='y = 2x')



"""

 

 

Python问题

1. ImportError: No module named '_tkinter', please install the python3-tk package? # 在ubuntu16.04中使用matplotlib时报错

解决办法:sudo apt-get install python3.6-tk

 

参考链接

1. subprocess.Popen介绍:https://blog.csdn.net/qq_34355232/article/details/87709418

2. python绘图介绍:https://www.cnblogs.com/onemorepoint/p/7482644.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python常用命令包括以下几个: 1. 要查看您正在运行的Python版本,可以使用以下命令: - python -? [1] - python -h [1] 2. 要查看Python版本号,可以使用以下命令: - python -V [2] - python --version [2] 3. 如果您想在不打开和编辑.py文件的情况下运行Python代码,可以使用以下命令: - python filename.py:直接运行指定的.py文件 4. 在命令行中执行Python代码时,您可能需要了解一些常用的命令: - print("Hello, World!"):打印输出文本或变量的值 - input("Enter your name: "):接收用户输入的数据 - if condition: ... else: ...:条件语句,根据条件执行不同的代码块 - for item in iterable: ...:循环语句,遍历可迭代对象并执行相应代码 - def function_name(parameters): ...:定义函数,用于封装可重用的代码块 - import module_name:导入外部模块,使用其中的函数和变量 - from module_name import function_name:从外部模块导入指定函数 - exit():退出Python解释器 Python是一种非常容易学习的编程语言,只要掌握了基本的语法和常用命令,就能够编写简单的程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [全网最全的Python常见命令大全,建议收藏,以防备用](https://blog.csdn.net/SpringJavaMyBatis/article/details/127451276)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值