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:\Users\zzz\Desktop\a.txt','/root/b.txt') ---》文件的绝对路径上传到linux目录下指定文件名,文件名可以修改
sftp.get('/root/b.txt',r'‪C:\Users\zzz\Desktop\a.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:\Users\zzz\Desktop\1.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:\Users\zzz\Desktop\1.txt.txt','rb') as f:
14     print(f.read())        #asdf爸爸---->b'asdf\xe7\x88\xb8\xe7\x88\xb8'  前面 b 表示bytes类型,英文可以直接用b读取,但是汉字会读取为二进制类型。
15     print(f.read().decode('utf-8'))      --->asdf爸爸 ,因为f里面的类型为rb,已经转码过,所以这里直接decode解码就行。#只能转码成二进制,解码成utf-8.
16 
17 with open(r'C:\Users\zzz\Desktop\1.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()
即名称空间访问顺序为:局部——全局——内置*   加载顺序是:内置——全局——局部   作用域:产生效果的范围,例一个函数体内

 

posted on 2019-04-25 16:52  猪肉佬!  阅读(647)  评论(1编辑  收藏  举报