远程控制管理---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)