当前位置:网站首页>更优雅地远程操作服务器:Paramiko库的实践
更优雅地远程操作服务器:Paramiko库的实践
2022-07-04 03:53:00 【软件质量保障】
持续坚持原创输出,点击蓝字关注我吧
作者:软件质量保障
知乎:https://www.zhihu.com/people/iloverain1024
作为一名测试,如果问你工作中和什么工具打交道的比较多,想必大多数人都会毫不犹豫的说服务器吧。
测试环境搭建、代码部署、问题定位日志查询这些都离不开操作服务器。我们操作服务的步骤一般是登录服务器,然后切到对应的日志目录下,通过grep/tail方式查询我们想要的日志。当然市面上也提供了很多辅助我们操作服务器的客户端,例如xshell/xftp,但是即使利用客户端,仍然是无法最大化减少我们的手工流水线式的操作。因此本文介绍一个高效的Python库Paramiko,帮助大家开发自己的日志查询工具。
Paramiko能做什么
paramiko是Python语言写的一个库,遵循SSH2协议,支持以加密和认证的方式进行远程服务器的连接,利用paramiko,可以方便地进行SSH连接服务器和服务器间文件传输。
Paramiko中的几个基础名词:
1. Channel:是一种安全的SSH传输通道;
2. Transport:使用时会同步创建一个加密的Tunnels(通道),这个Tunnels叫做Channel;
3. Session:是Client与Server保持连接的对象,用connect()/start_client()/start_server()开启会话。
如何使用Paramiko
Paramiko提供丰富的API供我们使用,本节主要介绍几种常用的API以及使用方法。
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/pip install paramiko
1.建立连接
paramiko.connect方法参数详解:
connect 常用参数
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, 是否打开压缩
方法一、密码连接服务器
import paramikofrom paramiko import SSHClientdef connect_with_password(host, username, password):ssh = paramiko.SSHClient()# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.load_system_host_keys()ssh.connect(host, username=username,password=password)session = ssh.get_transport().open_session()AgentRequestHandler(session)ssh_stdin, ssh_stdout, ssh_stderr = session.exec_command("ls -l")content = ssh_stdout.read()return session
方法二、密钥连接服务器
def connect_with_RSAKey(host, username, file):# 配置私人密钥文件位置private = paramiko.RSAKey.from_private_key_file(file)# private = paramiko.RSAKey.from_private_key_file('/Users/qa/.ssh/id_rsa')ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接SSH服务端,以用户名和密码进行认证ssh.connect(hostname=host, port=22, username=username, pkey=private)session = ssh.get_transport().open_session()AgentRequestHandler(session)ssh_stdin, ssh_stdout, ssh_stderr = session.exec_command("ls -l")content = ssh_stdout.read()return session
2.执行命令
使用exec_command执行命令会返回三个信息:
1、标准输入内容(用于实现交互式命令)--stdin
2、标准输出(保存命令的正常执行结果)--stdout
3、标准错误输出(保存命令的错误信息)--stderr
#定义函数ssh,把操作内容写到函数里def ssh_exe_cmd(host, username, password, content):session = connect_with_password(host, username, password)#使用exec_command方法执行命令,并使用变量接收命令的返回值并用print输出stdin, stdout, stderr = session.exec_command(content)return stdout.read()
3.上传下载
就像我们使用xshell在服务器上执行指令查询日志一样,我们也可以像xftp在服务器上上传下载文件。
#文件下载def download_file_ftp(host, username, password, local_path, remote_path):#与服务器创建ssh连接,transport方法建立通道,以元组的方式写服务器信息ssh_ftp = paramiko.Transport((host, 60317))ssh_ftp.connect(username=username, password=password)#创建连接后,使用sftpclient类和from_transport(括号里写上边创建的Transport通道)基于上边ssh连接创建一个sftp连接,定义成ftp_client变量后边方便引用ftp_client = paramiko.SFTPClient.from_transport(ssh_ftp)#下载文件#ftp_client.get("目标文件", r"保存位置,写到文件名")ftp_client.get(remote_path, local_path)#关闭ssh连接ssh_ftp.close()#文件上传def upload_file_ftp(host, username, password, local_path, remote_path):#与服务器创建ssh连接,transport方法建立通道,以元组的方式歇服务器信息ssh_ftp = paramiko.Transport((host, 60317))ssh_ftp.connect(username=username, password=password)#创建连接后,使用sftpclient类和from_transport(括号里写上边创建的Transport通道)基于上边ssh连接创建一个sftp连接,定义成ftp_client变量后边方便引用ftp_client = paramiko.SFTPClient.from_transport(ssh_ftp)#上传文件ftp_client.put(local_path, remote_path)#关闭ssh连接ssh_ftp.close()
基于Paramiko开发日志查询工具
实现原理很简单,就是自动化掉连接服务器(登录服务器)的部分,执行工具自动连接服务器,用户只需要输入日志查询指令即可。完整代码如下:
# -*- coding: utf-8 -*-# @Author : qualityassurance# @Email : [email protected]# @File : ParamikoUtil.py# @Time : 2022/7/3 11:13import paramikofrom paramiko.agent import AgentRequestHandlerhost = ''port = ''username = ''password = ''def connect_with_password(host, port, username, password):"""连接服务器,Client = paramiko.SSHClient()"""ssh = paramiko.SSHClient()try:ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.load_system_host_keys()ssh.connect(host, port=port, username=username,password=password)except Exception as e:print(e)return sshdef ssh_exe_cmd(client, cmd):"""将远程执行的命令结果返回:stdin, stdout, stderr (stdout)并decode输出..."""stdin, stdout, stderr = client.exec_command(cmd)print(stdout.read().decode())return stdoutdef main():"""设置远程执行Linux操作命令输入..."""client = connect_with_password(host, port, username, password)while True:cmd = input("输入需要执行的命令(空为退出):").strip()if cmd == "":return Falseelse:ssh_exe_cmd(client, cmd)if __name__ == "__main__":main()
喜欢的话,就点个赞和在看再走吧
- END -
下方扫码关注 软件质量保障,与质量君一起学习成长、共同进步,做一个职场最贵Tester!
往期推荐
边栏推荐
- Distributed system: what, why, how
- 什么是上下文?
- 如何远程办公更有效率 | 社区征文
- 程序员远程办公喜忧参半| 社区征文
- 仿《游戏鸟》源码 手游发号评测开服开测合集专区游戏下载网站模板
- 一位毕业生的自我分享
- UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x98 in position 1093: illegal multibyte sequence
- VIM mapping command
- leetcode刷题:二叉树06(对称二叉树)
- (pointeur) Écrivez - vous une fonction qui compare la taille de la chaîne et fonctionne comme strcmp.
猜你喜欢

Flink learning 7: application structure

96% of the collected traffic is prevented by bubble mart of cloud hosting

Redis:哈希hash类型数据操作命令
![[csrf-01] basic principle and attack and defense of Cross Site Request Forgery vulnerability](/img/46/cb5a10ffe3fcdffb7da68dbaef5b1f.png)
[csrf-01] basic principle and attack and defense of Cross Site Request Forgery vulnerability

Restore the subtlety of window position

Architecture practice camp - graduation project of module 9 of phase 6

leetcode:1314. 矩阵区域和【二维前缀和模板】

What does software testing do? Find defects and improve the quality of software

2021 RSC | Drug–target affinity prediction using graph neural network and contact maps

最长递增子序列问题(你真的会了吗)
随机推荐
[microservices openfeign] two degradation methods of feign | fallback | fallbackfactory
“找工作不要太在意工资”,这是我听过最大的谎言
Emlog user registration plug-in is worth 80 yuan
仿《游戏鸟》源码 手游发号评测开服开测合集专区游戏下载网站模板
Leader: who uses redis expired monitoring to close orders and get out of here!
Flink学习7:应用程序结构
Modstartblog modern personal blog system v5.2.0 source code download
leetcode刷题:二叉树09(二叉树的最小深度)
Pointer array and array pointer
Detailed explanation of event cycle
微信脑力比拼答题小程序_支持流量主带最新题库文件
NFT新的契机,多媒体NFT聚合平台OKALEIDO即将上线
Pytest basic self-study series (I)
NFT new opportunity, multimedia NFT aggregation platform okaleido will be launched soon
网络 - VXLAN
Wechat brain competition answer applet_ Support the flow main belt with the latest question bank file
MIN_RTO 对话
如何远程办公更有效率 | 社区征文
Senior developers tell you, how to write excellent code?
量子力学习题