博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常用模块介绍
阅读量:4597 次
发布时间:2019-06-09

本文共 8293 字,大约阅读时间需要 27 分钟。

subprocess模块

它是可以远程操作主机,模拟shell命令

'dir'是windows上查看任务的命令  

import subprocessobj = subprocess.Popen('dir', shell=True,                       stdout=subprocess.PIPE,                       stderr=subprocess.PIPE)#Popen是模拟cmd命令,'dir'是windows上查看任务的命令,shell=True是指可以用shell命令了, 输出和错误,放到管道(PIPE)里# print(obj.stdout.read().decode('gbk')) #打印输出的内容# print(obj.stderr.read().decode('gbk')) #打印错误的内容res = obj.stdout.read() + obj.stderr.read() #错误和输入放到一起给变量resprint(res.decode('gbk')) #打印res

在linux里可以创建python脚本,写入

import subprocessobj = subprocess.Popen('ls;lsblk', shell=True,                       stdout=subprocess.PIPE,                       stderr=subprocess.PIPE)#Popen是模拟cmd命令,'dir'是windows上查看任务的命令,shell=True是指可以用shell命令了, 输出和错误,放到管道(PIPE)里# print(obj.stdout.read().decode('utf-8')) #打印输出的内容# print(obj.stderr.read().decode('utf-8')) #打印错误的内容res = obj.stdout.read() + obj.stderr.read() #错误和输入放到一起给变量resprint(res.decode('utf-8')) #打印res

 socket模块

服务端步骤:

1、socket创建一个套接字

2、bind绑定ip和port

3、listen使套接字变为可以被动连接

4、accept等待客户端的连接

5、recv/send接收发送数据

import socket #导入模块server = socket.socket()#创建实例,传给server,默认TCPIP ipv4server.bind(('0.0.0.0', 8888))#0000代表暴露所有IP,或者冒号里边空着,也可以输入指定IPserver.listen(5)#监听最大5个链接print('等待电话。。。')conn, addr = server.accept()#链接和addr需要分别赋值,等待客户端连接,没有链接就等待print('电话来了。。。')#服务器接收消息data = conn.recv(1024) #接收消息,大小为1024print(data.decode('utf-8'))#服务器发送消息nfo = input('===>:')conn.send(info.encode('utf-8'))

客户端步骤:

1、创建套接字

2、连接服务器

3、发送数据,最大接收1024字节

4、关闭套接字

import socketclient = socket.socket()client.connect(('localhost', 8888))#如果是远程链接要写IP#客户发送消息info = input('===>:')client.send(info.encode('utf-8'))#客户接收消息data = client.recv(1024)print(data.decode('utf-8'))

先运行客户端,进入等待链接,然后运行服务端链接,输入聊天内容,回车发送,切换到客户端,回复收到的消息,这样就完成了聊天的过程,但是一人说一句后,我们看到程序结束了,那我们没聊够怎么办,对,加个循环。

我们在“服务器接收消息”和“客户端发送消息”之前加入while True:

并且下方整体缩进。

import socket #导入模块server = socket.socket()#创建实例,传给server,默认TCPIP ipv4server.bind(('0.0.0.0', 8888))#0000代表暴露所有IP,或者冒号里边空着,也可以输入指定IPserver.listen(5)#监听最大5个链接print('等待电话。。。')conn, addr = server.accept()#链接和addr需要分别赋值,等待客户端连接,没有链接就等待print('电话来了。。。')#服务器接收消息while True:    data = conn.recv(1024) #接收消息,大小为1024    print(data.decode('utf-8'))    #服务器发送消息    info = input('===>:')    conn.send(info.encode('utf-8'))
import socketclient = socket.socket()client.connect(('localhost', 8888))#如果是远程链接要写IP#客户发送消息while True:    info = input('===>:')    client.send(info.encode('utf-8'))    #客户接收消息    data = client.recv(1024)    print(data.decode('utf-8'))

这样我们就可以尽情的发送消息了

 

不过,当我们什么也不输入那么,会发现程序卡住了,再输入的内容(酷酷酷酷酷),也无法发送了,针对此,我们再原代码的基础上,客户端和服务端的发送条件加入为空循环

那么运行后,输入为空回车,将会重新上输入

 

这个时候我们发现,客户端没有发消息的话,那么服务端将一直等待,无法发送,整个程序处在半双工的情况下,所以我们要改成全双工,可以自由发送,那么就需要创建函数进程了

服务端:

import socket import threadingserver = socket.socket()server.bind(('0.0.0.0', 8888))server.listen(5)print('等待电话。。。')conn, addr = server.accept()print('电话来了。。。')def recv():    while True:        # 服务器接收消息        data = conn.recv(1024)         print(data.decode('utf-8'))def send():    while True:        # 服务器发送消息        info = input('===>:')        if not info:continue        conn.send(info.encode('utf-8'))t1 = threading.Thread(target=recv)t2 = threading.Thread(target=send)t1.start()t2.start()

客户端:

import socketimport threadingclient = socket.socket()client.connect(('localhost', 8888))def send():    while True:        # 客户发送消息        info = input('===>:')        if not info:continue        client.send(info.encode('utf-8'))def recv():    while True:        #客户接收消息        data = client.recv(1024)        print(data.decode('utf-8'))t1 = threading.Thread(target=send)t2 = threading.Thread(target=recv)t1.start()t2.start()

到此,一个聊天程序就基本成型了

进阶修炼:链接Linux,模拟远程控制

import socketimport subprocessimport threadingserver = socket.socket()server.bind(('', 8888))server.listen(5)print('等待电话.....')conn, addr = server.accept()print('电话来了......')while True:    data = conn.recv(10240)    cmd = subprocess.Popen(data.decode('utf-8'),                           shell=True,                           stdout=subprocess.PIPE,                           stderr=subprocess.PIPE)    stdout = cmd.stdout.read()    stderr = cmd.stderr.read()    conn.send(stdout + stderr)

链接成功后,客户端输入的命令,可以得到相应的反馈结果 

如:输入ls -l

 例:通过读写复制文件

with open(r'‪C:\Users\逸轩\Desktop\w.txt', 'rb')as f:#二进制读    data = f.read()with open(r'a.txt', 'wb')as f:#二进制写    f.write(data)

查看端口通不通

import socketclient = socket.socket()result = client.connect_ex(('192.168.11.128', 22))print(result)

运行结果:返回值为,说明通了,否则没通

re模块

.*?非贪婪匹配,根据要求尽可能的少找

.*贪婪匹配,尽可能的多找

按要求截取213123 和 12

import reinfo = 'qwffq213123feqfeqwf2132fd1f12rf1f21f'result1 = re.compile('fq(.*?)fe.*?1f(.*?)rf').findall(info)#加括号的代表要取的,不加括号的代表忽略的t = result1[0]res = ''.join(t)#把元组拼接成字符串print(res)

运行结果:

取所有数字

import reinfo = 'qwffq213123feqfeqwf2132fd1f12rf1f21f'res = re.compile('(\d+)').findall(info)#findall匹配所有result = ''.join(res)#把列表拼接成字符串print(result)

运行结果:

取“qwffq”和“fe”之间的内容

import reinfo = 'qwffq213123feqfeqwf2132fd1f12rf1f21f'res = re.compile('qwffq(.*?)fe').findall(info)print(res)

运行结果:

监控测试主机与端口通不通

import reimport socketdef sendmail(aa):    import smtplib    from email.mime.text import MIMEText    from email.header import Header    sender = 'liketimes@163.com'#发送的邮箱    receiver = 'liketimes@163.com'#接收的邮箱    subject = '报警'#邮件标题    username = 'liketimes@163.com'#邮箱用户名    password = '123qwe'#邮箱密码    msg = MIMEText(aa, 'plain', 'utf-8')    msg['Subject'] = Header(subject, 'utf-8')    msg['From'] = 'Tim
'#发送邮箱 msg['To'] = 'liketimes@163.com'#接收邮箱 smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()client = socket.socket()host_list = ['192.168.11.128:22','192.168.7.164:443']for info in host_list: ip = re.compile('(.*?):(.*)').search(info).group(1)#(.*?)是从左到右匹配到第一个冒号 port = re.compile('(.*?):(.*)').search(info).group(2)#(.*)是从冒号开始右边所有 result = client.connect_ex((ip, int(port))) if result != 0: sendmail('%s不通' % ip)

paramiko模块

作用:模拟ssh连接主机的,通过paramiko模块连接主机运行bash命令

import paramikohostname = '192.168.11.128'port = 22username = 'root'password = '123'ssh = paramiko.SSHClient() #声明实例ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#设置丢失主机的密钥策略,即不通过know_hosts文件进行连接ssh.connect(hostname=hostname,port=port,username=username,password=password)#连接主机stdin, stdout, stderr = ssh.exec_command("ls -ltr")#执行命令()print(stdout.read().decode('utf-8'))

运行结果:

上面我们得到了一个命令的结果,那么将命令变为变量,是不是就会变得不一样

import paramikohostname = '192.168.11.128'port = 22username = 'root'password = '123'ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname=hostname,port=port,username=username,password=password)while True:    cmd = input('===>:')    stdin, stdout, stderr = ssh.exec_command(cmd)    print(stdout.read().decode('utf-8'))

运行结果:

可以看到,我们可以随便输入想要查看的命令,但是没有返回值的命令是不可以的

通过paramiko模块连接主机上传

import paramikohostname = '192.168.11.128'port = 22username = 'root'password = '123't=paramiko.Transport((hostname, port)) #这个方法就相当于ftpt.connect(username=username,password=password)#用声明的实例链接ftpsftp = paramiko.SFTPClient.from_transport(t) sftp.put(r'D:\zzz.txt', '/root/aaa.txt' )#put上传sftp.close()

运行结果:

通过paramiko模块连接主机下载

import paramikohostname = '192.168.11.128'port = 22username = 'root'password = '123't=paramiko.Transport((hostname,port))t.connect(username=username,password=password)sftp = paramiko.SFTPClient.from_transport(t)sftp.get('/root/p.py', r'D:\python.py') #get下载sftp.close()

运行结果:

 pymysql模块

作用:操作数据库的,python3前用的是mysqldb

#pymysql操作数据库import pymysql# 打开数据库连接db = pymysql.connect(host="192.168.11.128", user="root",                     password="root", db="test1", port=3306)#数据库的用户名和密码# 使用cursor()方法获取操作游标cur = db.cursor()# 1.查询操作# 编写sql 查询语句  user 对应我的表名sql = "select students.name,students.age from students"try:    cur.execute(sql)  # 执行sql语句    results = cur.fetchall()  # 获取查询的所有记录    for i in results:#遍历结果        print(i)# except Exception as e: #异常处理(可有可无)#     raise efinally:    db.close()  # 关闭连接

运行结果:

例:批量操作,循环插入1000个数据

db = pymysql.connect(host="192.168.11.128", user="root",                     password="root", db="test1", port=3306)cur = db.cursor()for i in range(1000):    cur.execute("insert into aaaa values ('bbbb-%s')" % i)db.commit() #提交db.close()

运行结果

 

转载于:https://www.cnblogs.com/liketimes/p/10028832.html

你可能感兴趣的文章
rabbitmq
查看>>
解决Latex中Itemize距离过大的问题
查看>>
1打印沙漏
查看>>
LeetCode | Rotate List
查看>>
CodeForces - 455D
查看>>
【转】Django模糊查询
查看>>
Bugtags 创业一年总结
查看>>
UML建模原理
查看>>
[BZOJ 1083] [SCOI2005] 繁忙的都市
查看>>
图解C#的值类型,引用类型,栈,堆,ref,out
查看>>
spring5.0版本-AOP-如何实现拦截器链式调用(责任链模式)
查看>>
dht11 temperature & humidity sensor v2
查看>>
selenium 启动 IE11
查看>>
习题6.6
查看>>
系统分析与设计第三次作业
查看>>
Redis——非阻塞IO和队列
查看>>
iPad最值得期待的切实改进构想
查看>>
(转载)ERROR :“dereferencing pointer to incomplete type”是什么错误?
查看>>
jstack 堆栈日志分析
查看>>
Hystrix的一些应用和想法
查看>>