paramiko:模仿ssh连接linux运行命令以及上传下载
import paramiko ---》先下载模块加载 ssh =paramiko.SSHClient() ----》创建ssh对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ---》此设置作用为忽略not found known hosts文件的报错 ssh.connect(hostname='192.168.253.135',port=22,username='root',password='369369nx') ---》将主机名,端口号,用户名,密码输入 while True: stdin,stdout,stderr = ssh.exec_command(input('--->:').strip()) ----》自定义输入命令 res = stdout.read().decode('utf-8') + stderr.read().decode('utf-8') ---》将标准输出与错误输出结合 print(res)
hostname = '192.168.253.135' --->linux的ip地址 1
port = 22 ----》ssh端口号 2
username = 'root' ---》用户名 3
password = '369369ynx' ---》密码 4
t=paramiko.Transport((hostname,port)) ---》主机名和端口,注意要以元组的格式输入。
t.connect(username=username,password=password) ---》这里不需要更改,固定格式,如果更改可省略1 2 3 4步骤
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(r'C:UserszzzDesktopa.txt','/root/b.txt') ---》文件的绝对路径上传到linux目录下指定文件名,文件名可以修改
sftp.get('/root/b.txt',r'C:UserszzzDesktopa.txt') ---->将lilnux目录下的文件下载到指定地方并重命名
sftp.close()
os模块:
利用python调用系统命令
1 os.system('命令') 利用python调用系统命令,命令可以是以列表或者元组内的元素形式* res 2 import os 3 res=os.system('ipconfig') 4 print(res) # ----> ...0 如果返回0,则证明执行结果成功,其他值失败。可以此来验证命令是否执行成功。* 5 cmd=['ipconfig','systemctl restart network','setenforce 0'] 6 for i in cmd: 7 res = os.system(i) 8 print(res) ----> 0 1 1 即ipconfig成功,其他两个失败 9 10 res=os.path.exists(r'D:charm日常a.txt') #----》查看文件的绝对路径,如果是同级目录直接写文件名。 res 11 if res: #----》判断此文件是否存在 12 print('文件存在') 13 else: 14 os.system('dir') #--->如果不存在列出目录 15 print(res) #--->false 布尔,可用此来判断文件是否存在 16 17 os.remove('a.txt') --->a.txt文件被删除 18 19 os.path.join:拼接路径 res 20 HOME = 'etc/yum.repo.d/' 21 res=os.path.join(HOME,'a.txt') --->变量不需要引号 22 print(res) ---->etc/yum.repo.d/a.txt 成功拼接成一个路径 23 24 os.rename:重命名 25 os.rename('250.txt','250.py') #--->250.txt改名为250.py,不同后缀也可重命名
configparser模块:
读取配置文件
1 import configparser 2 config = configparser.ConfigParser() 3 config.read(r'D:charm日常mariadb.repo',encoding='utf-8') #绝对路径(相对路径) / utf-8,其他操作的的前提 4 注意如果读文件时没有r不会报错,但是会影响读取结果 5 config.add_section('zzz') #-->添加小模块 6 7 config.set('zzz','baseurl','http://1929393') #------》设置模块,变量名,变量值,都用引号,注意模块必须存在才能设置,如果
变量存在,则会刷新变量值
8 9 config.write(open('mariadb.repo','w')) #设置完要写入,才算保存了。 格式为.write(open('文件名',‘w')) 10 11 res=config.has_section('zzz') 12 print(res) #--->true 布尔 13 14 config.remove_option('zzz','baseurl') #---->删除zzz模块的baseurl这个变量,删除玩写入保存才生效 15 config.write(open('mariadb.repo','w')) 16 17 config.remove_section('hhh') # ----->将hhh这个模块的所有内容都删除 18 config.write(open('mariadb.repo','w')) 19 20 res=config.sections() #--->['zzz', 'hhh'] 将变量以列表格式输出 21 print(res) 22 23 res=config.get('zzz','baseurl') #---->查看zzz模块的变量的 变量值 24 print(res)
sock模块:
基于端口号和ip地址实现监控通信等
import socket #加载socket模块 import re #加载re模块 socket.setdefaulttimeout(1) #设置超时一秒钟 server=socket.socket() #创建socket模块的对象server hosts = ['11111:80','2222222:81','3333333:82'] #将多个ip地址与端口的组合放入列表 for i in hosts: ip = re.compile('(.*?):(.*)').search(i).group(1) #re.compile()为匹配正则,得出的结果为字符串格式 port = re.compile('(.*?):(.*)').search(i).group(2) #.*?为非贪婪匹配,反之.*为贪婪匹配。search为编译的主体,group为编译的部分 res=server.connect_ex((ip,int(port))) #判断端口是否启用,ip和端口要用元组格式,返回值为0才算启用。 if res == 0: print('端口启用') else: print('端口没启用') # 非贪婪匹配:在限制字符前尽可能少的匹配; # 贪婪匹配:极可能多的匹配
文件处理知识点
1 with open (r'C:UserszzzDesktop1.txt.txt','w',encoding='utf-8') as f: 2 res=f.readlines() --->['邻家有女初长成']将文件内容按列表格式读出 3 print(res) 4 res=f.read(3) #---->邻家有, 读取光标从左到右三个字符,而不是第三个字符 5 print(res) 6 print(f.read(2)) #----》光标在’有‘后面再往右读取两个字符 7 8 f.write('吧,baba') #---->f.wirte没有返回值,效果直接体现在文件中 9 f.writelines(['吧,爸爸']) #--->括号内可以是字符,元组或者列表,写进文件后都是以字符形式出现 10 11 print(f.readable()) ---->false 不可读。因为上面权限是w 12 13 with open (r'C:UserszzzDesktop1.txt.txt','rb') as f: 14 print(f.read()) #asdf爸爸---->b'asdfxe7x88xb8xe7x88xb8' 前面 b 表示bytes类型,英文可以直接用b读取,但是汉字会读取为二进制类型。 15 print(f.read().decode('utf-8')) --->asdf爸爸 ,因为f里面的类型为rb,已经转码过,所以这里直接decode解码就行。#只能转码成二进制,解码成utf-8. 16 17 with open(r'C:UserszzzDesktop1.txt.txt', 'r') as f: 18 data=f.read().encode() ---->将文件内容转为二进制类型,如果内容里面没有汉字,可直接在上方类型中加个b。b相当于.encode,但是如果有汉字则必须用encode 19 # print(data) 20 res=data.decode('utf-8') ----》二进制转码后需要decode解码 21 print(res)
1 with open(r'D:charm日常mariadb','rb') as f: #光标的移动只能在bytes类型下,除了0为光标置顶格,在两种类型下都可以 2 f.read(1) #1为相对位置 3 f.seek(2,1) #在当前位置的基础上向右移动两位,读取光标右边所有的字符 4 print(f.read().decode('utf-8')) #因为是bytes类型需要解码 5 f.seek(7,1) 6 print(f.read().decode('utf-8')) #--->汉字在bytes类型中占3个光标 7 8 f.seek(0,2) #(0,2)代表把光标移动到末尾 9 data =f.read() 10 print(data) #--->b'' 光标在末尾所以无法读取任何内容 11 f.seek(-1,2) 12 data=f.read() 13 print(data) #--->b'f' 光标在末尾,再往走移动一个光标
装饰器
在不改变源代码和调用方式的基础之上给函数增加新的功能
1 def deco(lala): # --->定义形参为lala 2 def wrapper(): 3 lala() #这里的作用是调用test(),所以要设置形参lala=test 4 print('77777') 5 return wrapper #--->这个是deco()的调用结果,注意位置,如果再缩进就成了wrapper()的调用结果 6 7 @deco #---》test = deco(test) 意思为test这个内存地址为deco()的调用结果也就是test = wrapper; 然后形参为test=lala. 8 def test(): 9 print('99999999')
10test()
可迭代对象与迭代器对象
1 #为什么要有迭代器?什么是可迭代对象?什么是迭代器对象? 2 #1、为何要有迭代器? 3 # 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的, 4 #: 若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 5 l1=['1','2','a'] 6 t1=(1,2,3) 7 str=('13daf') 8 d1={'a':'g',"aa":1} 9 set={1,2,'a'} 10 res=iter(l1.__iter__()) # 也可以写成res=iter(l1) 11 print(next(res)) # 1 12 print(next(res)) # 2 13 print(next(res)) # a 打印一次返回一个值,而不同for循坏一样会自动循坏所有值 14 print(next(res)) # StopIteration 停止迭代
名称与作用域
def f1(): def f2(): def f3(): print(x) f3() #---->嵌套的函数f3被调用后,函数体才生效报错,因为在f3局部空间内还是在全局都找不到变量的值。 f2() f1() def f1(): def f2(): x=1 def f3(): print(x)--->在f2中找到了x的赋值,但是这建立在f2被调用的前提下*/变量的赋值先是在本局部空间中寻找,然后是其他局部,然后才是全局和内置。 f3() f2() f1() 即名称空间访问顺序为:局部——全局——内置* 加载顺序是:内置——全局——局部 作用域:产生效果的范围,例一个函数体内