python自动化4-paramiko模块

远程控制管理---paramiko模块

系统批量运维管理

SSH终端

SSHClient类是SSH服务会话的高级表示,该类封装了传输(transport)、通道(channel)及SFTPClient的校验、建立的方法,通常用于执行远程命令。

有3个核心方法

1、connet 方法

2、exec_command 方法

3、set_missing_host 方法

练习
windows安装pip库
pip install paramiko

import paramiko

#连接服务器的4要素
host = '10.1.8.166'
port  = 22
user = 'root'
pwd = '1'

#连接服务过程生成日志
paramiko.util.log_to_file('SSH.log')
# 创建SSH客户端对象
ssh_client = paramiko.SSHClient()
# 定义连接策略
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#执行连接目标服务器
ssh_client.connect(hostname=host,port=port,username=user,password=pwd,allow_agent=False)
#执行远程命令 获取信息
command = input('请输入命令:')
stdin, stdout, stderr = ssh_client.exec_command(command)
#d打印获取信息
for i in stdout:
    print(i)
#关闭资源
stdin.close()
ssh_client.close()

需求任务
# 需求 巡检两台服务器,获取内存信息 把free状态的容量进行排序统计,并生成到sort.txt
import paramiko

#连接服务器的4要素
host = '10.1.8.166','10.1.8.30'
port  = 22
user = 'root'
pwd = '1'

#连接服务过程生成日志
paramiko.util.log_to_file('xunjian.log')
# 创建SSH客户端对象
ssh_client = paramiko.SSHClient()
# 定义连接策略
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#执行连接目标服务器
mem = []
for ip in host:
    ssh_client.connect(hostname=ip,port=port,username=user,password=pwd,allow_agent=False)
#执行远程命令 获取信息
    stdin, stdout, stderr = ssh_client.exec_command("free -m | grep Mem |awk '{print $4}'")
    output = stdout.read().decode()
    mem.append(int(output))
    # print(output)
#降序
# mem.sort(reverse=True)
#升序
mem.sort(reverse=False)
# print(mem)

new_list = []
for i in mem:
    new_list.append(str(i)+'\n')
# print(new_list)
with open('sort1.txt',mode='w',encoding='utf-8') as f:
    f.writelines(new_list)

#关闭资源
stdin.close()
ssh_client.close()

生成文件内容(根据升序降序生成)

函数封装写法
# 需求 巡检两台服务器,获取内存信息 把free状态的容量进行排序统计,并生成到sort.txt
import paramiko

#连接服务器的4要素
host = '10.1.8.166','10.1.8.30'
port  = 22
user = 'root'
pwd = '1'

#连接服务过程生成日志
paramiko.util.log_to_file('xunjian.log')
# 创建SSH客户端对象
ssh_client = paramiko.SSHClient()
# 定义连接策略
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#执行连接目标服务器
mem = []
for ip in host:
    ssh_client.connect(hostname=ip,port=port,username=user,password=pwd,allow_agent=False)
#执行远程命令 获取信息
    stdin, stdout, stderr = ssh_client.exec_command("free -m | grep Mem |awk '{print $4}'")
    output = stdout.read().decode()
    mem.append(int(output))
    # print(output)
#降序
# mem.sort(reverse=True)
#升序
mem.sort(reverse=False)
# print(mem)

new_list = []
for i in mem:
    new_list.append(str(i)+'\n')
# print(new_list)
with open('sort1.txt',mode='w',encoding='utf-8') as f:
    f.writelines(new_list)

#关闭资源
stdin.close()
ssh_client.close()

SFTP客户端

SFTPClient 实现远程文件操作,比如文件上传 下载 权限 状态等

1、from_transport方法

创建一个已连通的SFTP客户端通道

rom_transport(cls,t)
2、put方法

上传本地文件到远程SFTP服务器

目标路径全部写绝对路径

put(self, localpath,remotepath, callback=None, confirm=True)

说明
localpath(str类型),需上传的本地文件(源); *
remotepath(str类型),远程路径(目标); *要写绝对路径
callback(function(int,int)),获取已接收的字节数及总传输字节数,以便回调函数调用默认为 None;
confirm(bool类型),文件上传完毕后是否调用stat()方法,以便确认文件的大小。
3、get方法

从远程 SFTP 服务端下载文件到本地。

get(self, remotepath, localpath, callback=None)

说明
remotepath(str 类型),需下载的远程文件(源); *
localpath(str 类型),本地路径(目标);*
callback(function(int,int)),获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None。
4、其他方法
mkdir,在SFTP 服务器端创建目录,如 sftp.mkdir("/home/userdir",0755)。
remove,删除SFTP服务器端指定目录,如sftp.remove("/home/userdir")。
rename,重命名SFTP服务器端文件或目录,如
sfp.rename("/home/test.sh","/home/testfile.sh")。
stat,获取远程 SFTP服务器端指定文件信息,如sfp.stat("/home/testflie.sh")。
listdir,获取远程 SFTP服务器端指定目录列表,以Python的列表(List)形式返回,如
sftp.listdir("/home")。
案例
将本地xunjian.log 文件上传至服务器
import paramiko as pk
try:
    #监控语句
    host = '10.1.8.30'
    port = 22
    user = 'root'
    pwd = '1'
    #创建传输对象
    t = pk.Transport(host,port)
    # 连接目标服务器
    t.connect(username=user,password=pwd)
    # sftp 客户端对象
    sftp = pk.SFTPClient.from_transport(t)
    #本地文件上传
    sftp.put('xunjian.log','/root/xunjian.log')
    print('上传成功')
    t.close()
except Exception as err:
    print(err)

执行后服务器验证
[root@localhost-hehe ~ 15:04:11]$ ll
总用量 4
-rw-------. 1 root root 1084 7月   3 10:14 anaconda-ks.cfg
[root@localhost-hehe ~ 15:04:13]$ pwd
/root
[root@localhost-hehe ~ 15:04:18]$ ll
总用量 360
-rw-------. 1 root root   1084 7月   3 10:14 anaconda-ks.cfg
-rw-r--r--  1 root root 362816 7月  16 15:05 xunjian.log

执行脚本

验证文件

服务器文件拉到本地

服务器创建文件

import paramiko as pk
try:
    #监控语句
    host = '10.1.8.30'
    port = 22
    user = 'root'
    pwd = '1'
    #创建传输对象
    t = pk.Transport(host,port)
    # 连接目标服务器
    t.connect(username=user,password=pwd)
    # sftp 客户端对象
    sftp = pk.SFTPClient.from_transport(t)
    # #本地文件上传
    # sftp.put('xunjian.log','/root/xunjian.log')
    # print('上传成功')

    # 远程文件下载
    sftp.get('/root/test.txt','D:\\A01yunjisuan\\PycharmProjects\\pythonProject\\python内容\\paramiko\\test.txt')
    print('下载成功')

    t.close()
except Exception as err:
    print(err)

验证

其他辅助命令

import paramiko as pk
try:
    #监控语句
    host = '10.1.8.30'
    port = 22
    user = 'root'
    pwd = '1'
    #创建传输对象
    t = pk.Transport(host,port)
    # 连接目标服务器
    t.connect(username=user,password=pwd)
    # sftp 客户端对象
    sftp = pk.SFTPClient.from_transport(t)

    #创建文件夹
    sftp.mkdir('/root/test1')
    #移动和重命名dir    (路径一致表示重命名,路径不一致表示移动
    sftp.rename('/root/test1','/root/test2')
    #删除dir
    sftp.rmdir('/root/test2')
    #文件状态
    info = sftp.stat('/root/test.txt')
    print(info)
    # 查看目录下的文件列表
    print(sftp.listdir('/root/'))

    t.close()
except Exception as err:
    print(err)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值