yagmail模塊
python標准庫中發送電子郵件的模塊比較復雜,因此,有許多開源的庫提供了更加易用的接口來發送電子郵件,其中yagmail是一個使用比較廣泛的開源項目,yagmail底層依然使用smtplib和email模塊,但是yagmail提供了更好的接口,並具有更好的易讀性。
在使用前需要安裝
pip install yagmail
import yagmail
#連接郵箱服務器
yag = yagmail.SMTP(user='xxx@163.com', password='xxxx', host='smtp.163.com')
#發送郵件
yag.send(to='xxx@126.com', cc='xxx@163.com'(抄送),subject='這是測試郵件', contents='這是測試郵件的內容')
#斷開連接
yag.close()
yag = yagmail.SMTP(user='xxx@163.com', password='xxxx', host='smtp.163.com')
#發送郵件
yag.send(to='xxx@126.com', cc='xxx@163.com'(抄送),subject='這是測試郵件', contents='這是測試郵件的內容')
#斷開連接
yag.close()
os模塊
#os.system利用python幫我們調用系統命令
#res返回0就等於命令執行成功,如果不為0執行結果失敗
import os
res=os.system('ipconfig')
print(res)
0
import os
lt=['systemctl restart httpd','ip-a','uname-r']
for i in lt:
p=os.system(i)
if p==0:
print('good')
else:
print('bad')
#path.exists判斷是否存在這個文件或者目錄(絕對路徑)
res = os.path.exists(r'a.txt')
if res:
print('文件已存在')
else:
os.system('dir')
#remove移除文件或目錄(絕對路徑)
os.remove('a.txt')
#rename重命名(絕對路徑)
os.rename('lock.txt', '250.txt')
#path.join,拼接路徑
HOME = '/etc/yum.repo.d/'
res = os.path.join(HOME,'a.txt')
print(res)
configparse模塊
一、ConfigParser簡介
ConfigParser 是用來讀取配置文件的包。配置文件的格式如下:中括號“[ ]”內包含的為section。section 下面為類似於key-value 的配置內容。
[db]
db_host = 127.0.0.1
db_port = 69
db_user = root
db_pass = root
host_port = 69
[concurrent]
thread = 10
processor = 20
括號“[ ]”內包含的為section。緊接着section 為類似於key-value 的options 的配置內容。
二、ConfigParser 初始化對象
使用ConfigParser 首選需要初始化實例,並讀取配置文件:
ConfigParser 是用來讀取配置文件的包。配置文件的格式如下:中括號“[ ]”內包含的為section。section 下面為類似於key-value 的配置內容。
[db]
db_host = 127.0.0.1
db_port = 69
db_user = root
db_pass = root
host_port = 69
[concurrent]
thread = 10
processor = 20
括號“[ ]”內包含的為section。緊接着section 為類似於key-value 的options 的配置內容。
二、ConfigParser 初始化對象
使用ConfigParser 首選需要初始化實例,並讀取配置文件:
import configparser
config=configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312') #文件所在位置絕對路徑或相對路徑
config.add_section('werrtt') #添加到文件的section
config.write(open(r'D:\demo\build\hao\pgp','w')) #必須保存
三、ConfigParser 常用方法
1、獲取所用的section節點
# 獲取所用的section節點
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp', encoding="gb2312")
print(config.sections())
#運行結果
# ['hao', 'abc']
2、獲取指定section 的options。即將配置文件某個section 內key 讀取到列表中:
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
r = config.options("hao") #section必須存在,否則報錯
print(r)
#運行結果
# ['db_host', 'db_port', 'db_user', 'db_pass', 'host_port']
3、獲取指定section下指定option的值
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
r = config.get("hao", "use") #option與section必須存在,否則報錯
# r1 = config.getint("db", "k1") #將獲取到值轉換為int型
# r2 = config.getboolean("db", "k2" ) #將獲取到值轉換為bool型
# r3 = config.getfloat("db", "k3" ) #將獲取到值轉換為浮點型
print(r)
#運行結果
# 127.0.0.1
4、config.items獲取指定section的所用配置信息
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
r = config.items("hao")
print(r)
#運行結果
#[('db_host', '127.0.0.1'), ('db_port', '69'), ('db_user', 'root'), ('db_pass', 'root'), ('host_port', '69')]
5、config.set修改某個option的值,如果不存在則會創建,此時section必須存在。
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
config.set("hao", "use", "69") #修改use的值為69
config.write(open("r'D:\demo\build\hao\pgp", "w"))
6、檢查section或option是否存在,返回的是布爾值
import configparser
config = configparser.ConfigParser()
config.has_section("section") #是否存在該section
config.has_option("section", "option") #是否存在該option
7、添加section 和 option
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
if not config.has_section("hao"): # 檢查是否存在section
config.add_section("default")
if not config.has_option("default", "db_host"): # 檢查是否存在該option
config.set("default", "db_host", "1.1.1.1")
config.write(open("r'D:\demo\build\hao\pgp", "w"))
8、remove刪除section 和 option
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
config.remove_section("hao") #整個section下的所有內容都將刪除
config.write(open("r'D:\demo\build\hao\pgp", "w"))
9、寫入文件
以下的幾行代碼只是將文件內容讀取到內存中,進過一系列操作之后必須寫回文件,才能生效。
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
#寫回文件的方式如下:(使用configparser的write方法)
config.write(open("ini", "w"))
10、#config.values 查看所有section
import configparser
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
config = configparser.ConfigParser()
config.read(r'D:\demo\build\hao\pgp',encoding='gb2312')
res=config.values()
for i in res:
print(i)
config.write(open(r'D:\demo\build\hao\pgp','w'))
paramiko模塊
#通過paramiko模塊連接主機運行bash命令,模擬ssh連接nilux虛擬主機
import paramiko
import paramiko
ssh=paramiko.SSHClient() #初始化對象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh.connect(hostname='192.168.220.111',port=22,username='root',password='060910') #連接
while True:
stdin,stdout,stderr=ssh.exec_command(input('請輸入命令:'))
if stdout:
print(stdout.read().decode('gb2312'))
else:
print(stderr.read().decode('gb2312'))
#通過paramiko模塊連接主機上傳
import paramiko
hostname = '192.168.220.111'
port = 22
username = 'root'
password = '060910'
t=paramiko.Transport((hostname,port))
t.connect(username=username,password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(r'C:\Users\Administrator\Desktop\a.txt', '/root/aa.txt')
sftp.close()
#通過paramiko模塊連接主機下載
#通過paramiko模塊連接主機下載
import paramiko
hostname = '192.168.220.111'
port = 22
username = 'root'
password = '060910'
t=paramiko.Transport((hostname,port))
t.connect(username=username,password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get('/root/aa.txt', r'C:\Users\Administrator\Desktop\bb.txt')
sftp.close()
socket模塊
#linux服務器(半雙工)
import socket
import subprocess
import threading
server = 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.stdout.read()
conn.send(stdout + stderr)
#客戶端
import socket
import threading
client = socket.socket()
client.connect(('192.168.254.24', 8888))
while True:
info = input('===>:')
if not info:continue
client.send(info.encode('utf-8'))
data = client.recv(10240)
print(data.decode('utf-8'))
import socket
import subprocess
import threading
server = 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.stdout.read()
conn.send(stdout + stderr)
#客戶端
import socket
import threading
client = socket.socket()
client.connect(('192.168.254.24', 8888))
while True:
info = input('===>:')
if not info:continue
client.send(info.encode('utf-8'))
data = client.recv(10240)
print(data.decode('utf-8'))
#全雙工電話
#服務器端
import socket
import subprocess
import threading
server = socket.socket()
server.bind(('', 8888))
server.listen(5)
print('等待電話.....')
conn, addr = server.accept()
print('電話來了......')
def recv():
while True:
data = conn.recv(10240)
print(data.decode('utf-8'))
def send():
while True:
data = input('===>:')
conn.send(data.encode('utf-8'))
t1 = threading.Thread(target=recv)
t2 = threading.Thread(target=send)
t1.start()
t2.start()
#客戶端
import socket
import threading
client = socket.socket()
client.connect(('localhost', 8888))
def send():
while True:
info = input('===>:')
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()
#服務器端
import socket
import subprocess
import threading
server = socket.socket()
server.bind(('', 8888))
server.listen(5)
print('等待電話.....')
conn, addr = server.accept()
print('電話來了......')
def recv():
while True:
data = conn.recv(10240)
print(data.decode('utf-8'))
def send():
while True:
data = input('===>:')
conn.send(data.encode('utf-8'))
t1 = threading.Thread(target=recv)
t2 = threading.Thread(target=send)
t1.start()
t2.start()
#客戶端
import socket
import threading
client = socket.socket()
client.connect(('localhost', 8888))
def send():
while True:
info = input('===>:')
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()
import socket
socket.setdefaulttimeout(1)
socket.setdefaulttimeout(1)
#利用socket 監控端口號
import socket,re
hosts=['192.111.1.0:80','123.1.15.155:40','165.1.15.0:70','192.168.1.167:80']
for host in hosts:
ip=re.compile('(.*?):(.*)').search(host).group(1)
port=re.compile('(.*?):(.*)').search(host).group(2)
server = socket.socket()
server.settimeout(1)
res=server.connect_ex((ip,int(port)))
if res == 0:
print('%s--->%s,ok' % (ip,int(port)))
else:
print('%s--->%s,bu ok' % (ip,int(port)))
re模塊
.*?叫做非貪婪匹配,盡可能的少匹配
.*叫做貪婪匹配,盡可能的多匹配
\w
|
匹配字母數字
|
\W
|
匹配非字母數字
|
\s
|
匹配任意空白字符,等價於 [\t\n\r\f].
|
\S
|
匹配任意非空字符
|
\d
|
匹配任意數字,等價於 [0-9].
|
\D
|
匹配任意非數字
|
\A
|
匹配字符串開始
|
\Z
|
匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。c
|
\z
|
匹配字符串結束
|
\G
|
匹配最后匹配完成的位置。
|
\b
|
匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
|
\B
|
匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
|
\n, \t, 等.
|
匹配一個換行符。匹配一個制表符。等
|
\1...\9
|
匹配第n個分組的子表達式。
|
\10
|
匹配第n個分組的子表達式,如果它經匹配。否則指的是八進制字符碼的表達式。
|