Python自动化运维—Paramiko
Paramiko是用python语言写的一个模块,远程连接到Linux服务器,查看上面的日志状态,批量配置远程服务器,文件上传,文件下载等。
paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。
SSHClient常用的方法介绍
connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数
常用参数:
hostname 连接的目标主机
port=SSH_PORT 指定端口
username=None 验证的用户名
password=None 验证的用户密码
pkey=None 私钥方式用于身份验证
key_filename=None 一个文件名或文件列表,指定私钥文件
timeout=None 可选的tcp连接超时时间
allow_agent=True, 是否允许连接到ssh代理,默认为True 允许
look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
compress=False, 是否打开压缩
SSHClient常用的方法举例
import paramiko
# 实例化SSHClient
ssh_client = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接 ,此方法必须放在connect方法的前面
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接SSH服务端,以用户名和密码进行认证 ,调用connect方法连接服务器
ssh_client.connect(hostname='192.168.137.105', port=22, username='root', password='123456')
# 打开一个Channel并执行命令 结果放到stdout中,如果有错误将放到stderr中
stdin, stdout, stderr = ssh_client.exec_command('df -hT ')
# stdout 为正确输出,stderr为错误输出,同时是有1个变量有值 # 打印执行结果 print(stdout.read().decode('utf-8'))
# 关闭SSHClient连接
ssh_client.close()
密钥连接方式
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
#实例化SSHClient
ssh_client = paramiko.SSHClient()
#自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
ssh_client.connect(
hostname='192.168.137.100',
port=22,
username='root',
pkey=private
)
SFTPClient常用方法介绍
SFTPCLient作为一个sftp的客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,如上传、下载、权限、状态
from_transport(cls,t) 创建一个已连通的SFTP客户端通道
put(localpath, remotepath, callback=None, confirm=True) 将本地文件上传到服务器
参数confirm:是否调用stat()方法检查文件状态,返回ls -l的结果
get(remotepath, localpath, callback=None) 从服务器下载文件到本地
mkdir() 在服务器上创建目录
remove() 在服务器上删除目录
rename() 在服务器上重命名目录
stat() 查看服务器文件状态
listdir() 列出服务器目录下的文件
SFTPClient常用方法举例
import paramiko
# 实例化一个transport对象
tran = paramiko.Transport(('192.168.137.100', 22))
# 连接SSH服务端,使用password
tran.connect(username="root", password='123456')
# 或使用
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
# 连接SSH服务端,使用pkey指定私钥
tran.connect(username="root", pkey=private)
# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
# 设置上传的本地/远程文件路径
local_path = "/home/1.txt"
remote_path = "/tmp/1.txt"
# 执行上传动作
sftp.put(local_path, remote_path)
# 执行下载动作
sftp.get(remote_path, local_path)
# 关闭Transport通道
tran.close()
完整代码示例:
操作单台主机
# 单台主机操作
import paramiko
#############################配置信息#####################################
# 登陆参数设置
hostname = "192.168.137.100"
host_port = 22
username = "root"
password = "123456"
########################################################################
def ssh_client_con():
"""创建ssh连接,并执行shell指令"""
# 1 创建ssh_client实例
ssh_client = paramiko.SSHClient()
# 自动处理第一次连接的yes或者no的问题
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
# 2 连接服务器
ssh_client.connect(
port=host_port,
hostname=hostname,
username=username,
password=password
)
# 3 执行shell命令
# 构造shell指令
shell_command = "ps aux"
# 执行shell指令
stdin, stdout, stderr = ssh_client.exec_command(shell_command)
# 输出返回信息
stdout_info = stdout.read().decode('utf8')
print(stdout_info)
# 输出返回的错误信息
stderr_info = stderr.read().decode('utf8')
print(stderr_info)
def sftp_client_con():
# 1 创建transport通道
tran = paramiko.Transport((hostname, host_port))
tran.connect(username=username, password=password)
# 2 创建sftp实例
sftp = paramiko.SFTPClient.from_transport(tran)
# 3 执行上传功能
local_path = "米汤.jpg" # 本地路径
remote_path = "/home/333.jpg" # 远程路径
put_info = sftp.put(local_path, remote_path, confirm=True)
print(put_info)
print(f"上传{local_path}完成")
# 4 执行下载功能
save_path = "7.jpg" # 本地保存文件路径
sftp.get(remotepath=remote_path, localpath=save_path)
print(f'下载{save_path}完成')
# 5 关闭通道
tran.close()
# 调用函数执行功能
ssh_client_con()
sftp_client_con()
# 本例是单个主机操作
批量操作主机
import paramiko def ssh_client_con(): """创建ssh连接,并执行shell指令""" # 1 创建ssh_client实例 ssh_client = paramiko.SSHClient() # 自动处理第一次连接的yes或者no的问题 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy) # 2 连接服务器 ssh_client.connect( port=host_port, hostname=hostname, username=username, password=password ) # 3 执行shell命令 # 构造shell指令 shell_command = """ path='/tmp' tree ${path} # 如果tree命令执行失败,则安装tree后再执行 if [ $? -ne 0 ] then yum install -y tree tree ${path} fi """ # 执行shell指令 stdin, stdout, stderr = ssh_client.exec_command(shell_command) # 输出返回信息 stdout_info = stdout.read().decode('utf8') print(stdout_info) # 输出返回的错误信息 stderr_info = stderr.read().decode('utf8') print(stderr_info) def sftp_client_con(): # 1 创建transport通道 tran = paramiko.Transport((hostname, host_port)) tran.connect(username=username, password=password) # 2 创建sftp实例 sftp = paramiko.SFTPClient.from_transport(tran) # 3 执行上传功能 local_path = "米汤.jpg" remote_path = "/home/333.jpg" put_info = sftp.put(local_path, remote_path, confirm=True) print(put_info) print(f"上传{local_path}完成") # 4 执行下载功能 save_path = "7.jpg" sftp.get(remotepath=remote_path, localpath=save_path) print(f'下载{save_path}完成') # 5 关闭通道 tran.close() # 读取主机信息 try: with open('host_site.txt', 'r', encoding='utf8') as host_file: for host_info in host_file: line = host_info.strip('\n') hostname, host_port, username, password = line.split(',') print(f'---------------{hostname}执行结果-----------') ssh_client_con() # 执行command并返回结果 # 本例适合批量主机处理相同的command except FileNotFoundError as e: print(e) # host_site.txt 文件内容格式如下 # 主机地址 端口 用户 密码 # 192.168.137.100,22,root,123456 # 192.168.137.101,22,root,123456 # 192.168.137.102,22,root,123456 # 192.168.137.103,22,root,123456 # 192.168.137.104,22,root,123456
11
主题授权提示:请在后台主题设置-主题授权-激活主题的正版授权,授权购买:RiTheme官网
声明:本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。