前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >更优雅地远程操作服务器:Paramiko库的实践

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

作者头像
互联网金融打杂
发布2022-08-01 13:50:54
5340
发布2022-08-01 13:50:54
举报
文章被收录于专栏:测试开发架构之路

持续坚持原创输出,点击蓝字关注我吧

作者:软件质量保障 知乎: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以及使用方法。

代码语言:javascript
复制
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, 是否打开压缩

方法一、密码连接服务器

代码语言:javascript
复制
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

方法二、密钥连接服务器

代码语言:javascript
复制
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=, 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

代码语言:javascript
复制
#定义函数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在服务器上上传下载文件。

代码语言:javascript
复制
#文件下载
def download_file_ftp(host, username, password, local_path, remote_path):
    #与服务器创建ssh连接,transport方法建立通道,以元组的方式写服务器信息
    ssh_ftp = paramiko.Transport((host, ))
    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, ))
    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开发日志查询工具

实现原理很简单,就是自动化掉连接服务器(登录服务器)的部分,执行工具自动连接服务器,用户只需要输入日志查询指令即可。完整代码如下:

代码语言:javascript
复制
# -*- 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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 持续坚持原创输出,点击蓝字关注我吧
  • Paramiko能做什么
  • 如何使用Paramiko
  • 基于Paramiko开发日志查询工具
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档