当前位置:网站首页>更优雅地远程操作服务器: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 paramiko
from paramiko import SSHClient
def 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:13
import paramiko
from paramiko.agent import AgentRequestHandler
host = ''
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 ssh
def ssh_exe_cmd(client, cmd):
"""将远程执行的命令结果返回:stdin, stdout, stderr (stdout)并decode输出...
"""
stdin, stdout, stderr = client.exec_command(cmd)
print(stdout.read().decode())
return stdout
def main():
"""设置远程执行Linux操作命令输入..."""
client = connect_with_password(host, port, username, password)
while True:
cmd = input("输入需要执行的命令(空为退出):").strip()
if cmd == "":
return False
else:
ssh_exe_cmd(client, cmd)
if __name__ == "__main__":
main()
喜欢的话,就点个赞和在看再走吧
- END -
下方扫码关注 软件质量保障,与质量君一起学习成长、共同进步,做一个职场最贵Tester!
往期推荐
边栏推荐
- 沃博联结束战略评估,决定保留表现优异的博姿业务
- The interactive solution of JS and app in the H5 page embedded in app (parameters can be transferred and callbacks can be made)
- 架构实战营 - 第 6 期 模块九之毕业设计
- Boutique website navigation theme whole station source code WordPress template adaptive mobile terminal
- 2021 RSC | Drug–target affinity prediction using graph neural network and contact maps
- Tcp- simple understanding of three handshakes and four waves
- 仿《游戏鸟》源码 手游发号评测开服开测合集专区游戏下载网站模板
- 旭化成首次参展第五届中国国际进口博览会(5th CIIE)
- Virtual commodity account trading platform source code_ Support personal QR code collection
- Exercises in quantum mechanics
猜你喜欢
Wechat official account infinite callback authorization system source code
Flink learning 8: data consistency
最长递增子序列问题(你真的会了吗)
毕业设计项目
RPC技术
Boutique website navigation theme whole station source code WordPress template adaptive mobile terminal
DP83848+网线热拔插
R语言dplyr中的Select函数变量列名
透过JVM-SANDBOX源码,了解字节码增强技术原理
PPt 教程,如何在 PowerPoint 中将演示文稿另存为 PDF 文件?
随机推荐
Emlog用户注册插件 价值80元
One click compilation and deployment of MySQL
Leetcode skimming: binary tree 09 (minimum depth of binary tree)
B. All Distinct
EIG在智利推出可再生能源平台Grupo Cerro
C语言单向链表练习
精品网址导航主题整站源码 wordpress模板 自适应手机端
The interactive solution of JS and app in the H5 page embedded in app (parameters can be transferred and callbacks can be made)
[csrf-01] basic principle and attack and defense of Cross Site Request Forgery vulnerability
浅谈一篇优质的小红书文案需要具备什么
Wechat brain competition answer applet_ Support the flow main belt with the latest question bank file
Boutique website navigation theme whole station source code WordPress template adaptive mobile terminal
Exercises in quantum mechanics
毕业设计:设计秒杀电商系统
【愚公系列】2022年7月 Go教学课程 002-Go语言环境安装
一位毕业生的自我分享
leetcode:1314. 矩阵区域和【二维前缀和模板】
Operation of ES6
Katalon uses script to query list size
Wechat official account infinite callback authorization system source code