更优雅地远程操作服务器:Paramiko库的实践

简介: 测试环境搭建、代码部署、问题定位日志查询这些都离不开操作服务器。我们操作服务的步骤一般是登录服务器,然后切到对应的日志目录下,通过grep/tail方式查询我们想要的日志。当然市面上也提供了很多辅助我们操作服务器的客户端,例如xshell/xftp,但是即使利用客户端,仍然是无法最大化减少我们的手工流水线式的操作。因此本文介绍一个高效的Python库Paramiko,帮助大家开发自己的日志查询工具。

作为一名测试,如果问你工作中和什么工具打交道的比较多,想必大多数人都会毫不犹豫的说服务器吧。

测试环境搭建、代码部署、问题定位日志查询这些都离不开操作服务器。我们操作服务的步骤一般是先登录服务器,然后切到对应的日志目录下,通过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 : qualityassurance21@163.com

# @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()


https://docs.paramiko.org/en/stable/

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
Java Maven
【开源视频联动物联网平台】J2mod库写一个Modbus RTU 服务器
【开源视频联动物联网平台】J2mod库写一个Modbus RTU 服务器
59 0
|
2月前
|
监控 负载均衡 安全
幻兽帕鲁服务器搭建实践及优化经验分享
在多人在线游戏的世界里,一个稳定、高效的服务器是确保玩家获得流畅游戏体验的关键。最近,我亲自尝试了为“幻兽帕鲁”这款游戏搭建服务器,并在此过程中积累了一些宝贵的经验。今天,我就将这些经验分享给大家,希望能为同样热爱这款游戏的玩家们提供一些帮助。
83949 6
|
3月前
|
Linux Shell 开发工具
10分钟让你的Linux Shell终端变得更优雅,更高效——【Linux服务器下OhMyZsh+P10k安装实践】
10分钟让你的Linux Shell终端变得更优雅,更高效——【Linux服务器下OhMyZsh+P10k安装实践】
84 1
|
2月前
|
安全 Linux 网络安全
【Windows】搭建Emby媒体库服务器,实现无公网IP远程访问
【Windows】搭建Emby媒体库服务器,实现无公网IP远程访问
202 0
|
3月前
|
弹性计算 负载均衡 监控
幻兽帕鲁服务器部署实践体验
我的幻兽帕鲁服务器部署实践体验
80 1
|
3月前
|
监控 Linux Shell
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
在线上排查问题时,查询日志、查看系统配置和分析操作系统信息是至关重要的。这些操作可以帮助我们深入了解软件和服务的兼容性,并解决潜在的问题。在本次学习中,我们将介绍并深入学习一些我在处理类似问题时常用的指令。通过掌握这些指令,你将能够更加高效地定位和解决线上问题,提高系统的稳定性和性能。让我们一同进入这个学习过程吧!
43 0
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
|
4天前
|
Linux 数据安全/隐私保护
Linux基础与服务器架构综合小实践
【4月更文挑战第9天】Linux基础与服务器架构综合小实践
859 6
|
12天前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
1月前
|
弹性计算 算法 应用服务中间件
倚天使用|Nginx性能高27%,性价比1.5倍,基于阿里云倚天ECS的Web server实践
倚天710构建的ECS产品,基于云原生独立物理核、大cache,结合CIPU新架构,倚天ECS在Nginx场景下,具备强大的性能优势。相对典型x86,Http长连接场景性能收益27%,开启gzip压缩时性能收益达到74%。 同时阿里云G8y实例售价比G7实例低23%,是Web Server最佳选择。
|
1月前
|
弹性计算 NoSQL 测试技术
倚天使用|Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
137500 3