4.python 系统批量运维管理器之paramiko模块
paramiko
paramiko是ssh服务最经常使用的模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
paramiko实现ssh2不外乎两个角度:SSH客户端与服务端
- SSHClient:包装了Channel,Transport,SFTPClient。
- Channel:是一种Socket类,一种安全的SSH传输通道。
- Transport:是一种加密的会话(但是这样一个对象的Session并未建立),并且创建了一个加密的tunnels,这个tunnels叫做Channel。
- Session:是Client与Server保持连接的对象,用Connect(),start_client(),start_server()开始会话。
具体请参考paramiko的库文档:http://docs.paramiko.org/en/2.0/index.html
使用pip install paramiko安装,失败的话,建议使用yum安装:yum install python-paramiko
代码实例:
paramiko远程密码连接:
import paramiko #实例化SSHClient
client = paramiko.SSHClient() #创建ssh连接日志文件(只保留前一次连接的详细日志,以前的日志会自动被覆盖)
paramiko.util.log_to_file('paramiko.log') #自动添加策略,保存服务器的主机名和密钥信息,如果不添加,不在know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='127.0.0.1', port=, username='root', password='') #打开一个Channel并执行命令
stdin,stdout,stderr = client.exec_command(command) #打印执行结果
result=stdout.read().decode('utf-8')
print(result) #关闭SSHClient连接
client.close()
SSHClient()里面有一个transport变量,这个是用于获取连接的,因此我们也可以单独获取到transport变量,然后执行连接操作:
import paramiko #创建一个通道
transport = paramiko.Transport(('127.0.0.1', )) #用户名密码连接服务器
transport.connect(username='root', password='') #实例化SSHClient
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command(command)
print(stdout.read().decode('utf-8')) #关闭连接
transport.close()
paramiko使用密钥连接
import paramiko
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/zjz/.ssh/id_rsa')
#实例化SSHClient
client = paramiko.SSHClient()
#自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='127.0.0.1',port=,username='root',pkey=private)
# 打开一个Channel并执行命令
stdin, stdout, stderr = client.exec_command(command)
# stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
# 打印执行结果
print(stdout.read().decode('utf-8'))
# 关闭SSHClient
client.close()
使用transport封装使用密钥连接:
import paramiko
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/zjz/.ssh/id_rsa')
# 创建一个通道
transport = paramiko.Transport(('127.0.0.1', ))
transport.connect(username='root', pkey=private_key)
#实例化SSHClient
client = paramiko.SSHClient()
client._transport = transport
# 打开一个Channel并执行命令
stdin, stdout, stderr = client.exec_command('df -h ')
# stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
# 打印执行结果
print(stdout.read().decode('utf-8'))
# 关闭SSHClient
transport.close()
SFTPClient实现上传文件
import paramiko
# 获取Transport实例
tran = paramiko.Transport(('127.0.0.1', ))
# 连接SSH服务端,使用password
tran.connect(username="root", password='')
# 或使用
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/zjz/.ssh/id_rsa')
# 连接SSH服务端,使用pkey指定私钥
tran.connect(username="root", pkey=private)
# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
# 设置上传的本地/远程文件路径
localpath = "/Users/1.txt"
remotepath = "/tmp/1.txt"
# 执行上传动作
sftp.put(localpath, remotepath)
#如果远程主机有这个文件则返回一个对象,负责抛出异常
try:
sftp.file(remotepath)
print("上传成功")
except IOError:
print("上传失败")
finally:
# 关闭连接
tran.close()
SFTPClinet实现下载文件
import paramiko
import os
# 获取Transport实例
tran = paramiko.Transport(('127.0.0.1', ))
# 连接SSH服务端,使用password
tran.connect(username="root", password='')
# 或使用
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/zjz/.ssh/id_rsa')
# 连接SSH服务端,使用pkey指定私钥
tran.connect(username="root", pkey=private)
# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
# 设置下载的本地/远程文件路径
localpath = "/Users/1.txt"
remotepath = "/tmp/1.txt"
#判断远程服务器是否有这个文件
try:
sftp.file(remotepath)
#执行下载动作
sftp.get(remotepath, localpath)
except IOError as e:
print(remotepath+"remote file no exit!")
exit()
finally:
#关闭连接
sftp.close()
if os.path.isfile(localpath):
print("下载成功")
else:
print("下载失败")
SSHClient也可以实现交互式终端
核心代码:
# 打开一个通道
channel = trans.open_session()
# 获取终端
channel.get_pty()
# 激活终端,这样就可以登录到终端了,就和我们用类似于xshell登录系统一样
channel.invoke_shell()
重要的是select模块的使用,select会监听socket或者文件描述符的I/O状态变化,并返回变化的socket或者文件描述符的对象
r_list,w_list,x_list = select.select(rlist, wlist, xlist, timeout])
参数详解:
- rlist:list类型,监听其中的socket或者文件描述符是否变为可读状态,返回那些可读的socket或者文件描述符组成的list。
- wlist:list类型,监听其中的socket或者文件描述符是否变为可写状态,返回那些可写的socket或者文件描述符组成的list。
- xlist:list类型,监听其中的socket或者文件描述符是否出错,返回那些出错的socket或者文件描述符组成的list。
- timeout:设置select的超时时间,设置为None代表永远不会超时,即阻塞。
详细模块用法见:https://blog.csdn.net/weixin_43367828/article/details/84640103
xshell功能实现
import paramiko
import os
import select
import sys # 建立一个socket
trans = paramiko.Transport(('127.0.0.1', )) # 启动一个客户端
trans.start_client() # 如果使用rsa密钥登录的话
'''
default_key_file = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
prikey = paramiko.RSAKey.from_private_key_file(default_key_file)
trans.auth_publickey(username='super', key=prikey)
''' # 如果使用用户名和密码登录
trans.auth_password(username='root', password='123456') # 打开一个通道
channel = trans.open_session() # 获取终端
channel.get_pty() # 激活终端,这样就可以登录到终端了,就和我们用类似于xshell登录系统一样
channel.invoke_shell() # 下面就可以执行你所有的操作,用select实现
# 对输入终端sys.stdin和 通道进行监控,
# 当用户在终端输入命令后,将命令交给channel通道,这个时候sys.stdin就发生变化,select就可以感知
# channel的发送命令、获取结果过程其实就是一个socket的发送和接受信息的过程 while True:
readlist, writelist, errlist = select.select([channel, sys.stdin,], [], [])
# 如果是用户输入命令了,sys.stdin发生变化
if sys.stdin in readlist:
# 获取输入的内容
input_cmd = sys.stdin.read(1)
# 将命令发送给服务器
channel.sendall(input_cmd)
# 服务器返回了结果,channel通道接受到结果,发生变化 select感知到
if channel in readlist:
# 获取结果
result = channel.recv(1024)
# 断开连接后退出
if len(result) == 0:
print("\r\n**** EOF **** \r\n")
break
# 输出到屏幕
sys.stdout.write(result.decode())
sys.stdout.flush()
# 关闭通道
channel.close()
# 关闭链接
trans.close()
SSHClient实现堡垒机模式下的命令执行
堡垒机在一定程度上提升了运营安全级别,但同时也提高了日常运营成本,作为管理的中转设备,任何针对业务服务器的管理请求都会经过此节点,比如SSH协议,首先运维人员在办公电脑通过SSH协议登陆堡垒机,再通过堡垒机SSH跳转到所有的业务服务器进行维护操作。
可以利用paramiko的invoke_shell机制实现通过堡垒机实现服务器操作,原理是SSHClient.connect到堡垒机后开启一个新的SSH会话(session),通过新的会话运行 "sshuser@IP" 去实现远程命令执行。
SFTPClient实现堡垒机模式下的远程文件上传
实现堡垒机模式下的文件上传,原理是通过paramiko的SFTPClient将文件从办公设备上传至堡垒机指定的临时目录,如 /tmp。再通过SSHClient的invoke_shell方法开启ssh会话,执行scp命令,将 /tmp下的指定文件复制到目标业务服务器上。
具体代码实现请参考:http://www.cnblogs.com/charliedaifu/p/10098848.html
sftp是安全文件传输协议,提供一种安全的加密方法,sftp是SSH的一部分,SFTPClient类实现了sftp客户端,通过已建立的SSH通道传输文件,与其他的操作,如下:
| 方法 | 描述 |
|---|---|
| sftp.getcwd() | 返回当前工作目录 |
| sftp.chdir(path) | 改变工作目录 |
| sftp.chmod(path, mode) | 修改权限 |
| sftp.chown(path, uid, gid) | 设置属主属组 |
| sftp.close() | 关闭sftp |
| sftp.file(filename, mode=’r’, bufsize=-1) | 读取文件 |
| sftp.from_transport(s) | 创建SFTP客户端通道 |
| sftp.listdir(path=’.’) | 列出目录,返回一个列表 |
| sftp.listdir_attr(path=’.’) | 列出目录,返回一个SFTPAttributes列表 |
| sftp.mkdir(path, mode=511) | 创建目录 |
| sftp.normalize(path) | 返回规范化path |
| sftp.open(filename, mode=’r’, bufsize=-1) | 在远程服务器打开文件 |
| sftp.put(localpath, remotepath, callback=None) | localpath文件上传到远程服务器remotepath |
| sftp.get(remotepath, localpath, callback=None) | 从远程服务器remotepath拉文件到本地localpath |
| sftp.readlink(path) | 返回一个符号链接目标 |
| sftp.remove(path) | 删除文件 |
| sftp.rename(oldpath, newpath) | 重命名文件或目录 |
| sftp.rmdir(path) | 删除目录 |
| sftp.stat(path) | 返回远程服务器文件信息(返回一个对象的属性) |
| sftp.truncate(path, size) | 截取文件大小 |
| sftp.symlink(source, dest) | 创建一个软链接(快捷方式) |
| sftp.unlink(path) | 删除软链接 |
参考连接:
https://blog.csdn.net/songfreeman/article/details/50920767
https://blog.csdn.net/qq_29778641/article/details/82186438
https://blog.csdn.net/forever_wen/article/details/82556154
4.python 系统批量运维管理器之paramiko模块的更多相关文章
- 8.python 系统批量运维管理器之pexpect模块
小插曲 前几节讲了paramiko模块,但是pexpect模块的功能几乎跟paramiko一样,先来分析一下: 1.各自介绍 pexpect是一个通过启动子程序,使用正则表达式对程序输出做出特定响应, ...
- 9.python 系统批量运维管理器之Fabric模块
前面介绍了paramiko,pexpect模块,今天来说比较适合大型应用自动化部署的模块,或者执行系统命令的模块Fabric. Fabric 是一个 Python 的库,同时它也是一个命令行工具.它提 ...
- 【Python】神器:Streamlit,仅使用Python开发一个运维管理后台(不需要编写html,js,css)
背景 作为SRE,我们有很多很多自动化的工具,大部分都是自动运行的,还有一部分是CLI,我们一直苦于没有一个自己的管理后台网站,受限于前端能力薄弱,开发出来的网页只能说凑活能用,但是不好用. 现在我们 ...
- 系统批量运维管理器paramiko详解
一.paramiko介绍 paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式.可以实现远程命令执行.文件传输.中间SSH代理等功能,相对于Pexpect,封装的层次更高, ...
- Linux运维之Ansible自动化运维管理工具
Ansible简介:Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务.后面会提到批量安装 ...
- django 实现linux运维管理平台
概述 使用django实现一个linux运维管理平台,可以实现注册登录,机器管理 ,服务器批量操作,服务器性能监控. 详细 代码下载:http://www.demodashi.com/demo/112 ...
- Ansible 自动化运维管理工具
Ansible 自动化运维管理工具 1.Ansible概述 2.Ansible部署 3.Ansible模块 1.Ansible概述: Ansible是一个基于Python开发的配置管理和应用部署工具, ...
- 系统批量运维管理器Fabric详解
系统批量运维管理器Fabric详解 Fabrici 是基于python现实的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包 ...
- 解决连锁零售行业IT运维管理四大困境
解决连锁零售行业IT运维管理四大困境 中国近年来,连锁零售行业进入了行业的发展高潮,迅速崛起一批大型连锁业态.而随着IT技术的不断进步,连锁零售企业已经步入IT信息化快速发展的重要阶段:在面对激烈 ...
随机推荐
- C#动态执行代码
在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assem ...
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) C. Bear and Drawing
题目链接:http://codeforces.com/contest/573/problem/C题目大意:在两行无限长的点列上面画n个点以及n-1条边使得构成一棵树,并且要求边都在同一平面上且除了节点 ...
- Indy发送邮件被kbas退掉
用indy开发了发送邮件程序,通过126,sina等发送邮件可以发送出去,而通过tom,163则被退回,显示被 kbas系统退回.后来通过观察Foxmail的通讯过程,区别在foxmail发送EHLO ...
- mysql事务隔离级别测试
隔离性mysql提供了4种不同的隔离级别以支持多版本并发控制(MVCC)较低级别的隔离通常可以执行更高的并发,系统的开销也更低read uncommited(未提交读)read commited(提交 ...
- css控制div字数出现点点点
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
- mac 在终端使用命令行启动脚本,无法使用自己安装的python去执行脚本问题
参考了2片文章: //查看python位置 which python //先备份 1.sudo cp /usr/bin/python /usr/bin/python_cp //删除 2.sudo rm ...
- 反射getattr,hasattr,setattr,delattr
通过字符串映射或修改程序运行时的状态.属性.方法, 有以下4个方法 getattr(object, name_str, default=None) 根据字符串name_str去获取obj对象里的方法内 ...
- MySQL router
MySQL Router is a building block for high availability (HA) solutions. It simplifies application dev ...
- Python web框架 flask
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- java-虚拟机-索引
底层 JVM之堆内存(年经代,老年代) Java内存泄露的理解与解决 内存溢出和内存泄漏的区别.产生原因以及解决方案 JVM内容梳理 Jvm的体系结构