python使用paramiko管理多台服务器

2022-06-21 16:18:47 浏览数 (1)

痛点

举个工作中常见的例子,现有这样的需求:需要使用mac客户端,远程连接到Linux服务器,查看上面的文件大小,通常使用的方法是如下几种:

  • 用telnet
  • 用PUTTY
  • 用SCP
  • 用XManager等

如果需求又增加一条,要从服务器上下载文件,该怎么办? 那常用的办法可能会是:

  • Linux上安装FTP并配置
  • Linux上安装Sambe并配置等

会发现一个共性,常见的解决方案,对远程服务器必要的配置。那如果需要多几十台或者几百台Linux服务器进行一样的操作呢? 这种执行效率必然低。

paramiko的诞生就可以很好解决上述问题。paramiko仅需要在本地上安装python以及PyCrypto,对于连接多台服务器,进行复杂及重复的操作的操作特别有帮助。

paramiko

介绍

paramiko是用python语言写的一个第三方库,支持加密认证的方式,遵循SSH2协议,可以进行远程服务器的连接。

能够跨平台运行的语言,支持多平台,如Linux、MacOS、Windows等。因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是一个不错的选择。

安装

安装第三方库,一般会使用pip命令行安装。由于网络原因,使用国内镜像源会提升下载安装速度。

pycrypto,由于paramiko模块内部依赖pycrypto,所以先下载安装pycrypto。

安装命令如下:

代码语言:javascript复制
pip install -i https://pypi.doubanio.com/simple/  --trusted-host pypi.doubanio.com pycrypto

pip install -i https://pypi.doubanio.com/simple/  --trusted-host pypi.doubanio.com paramiko

使用

连接方式

下面是三种使用paramiko连接到Linux服务器的代码。

方式一

使用口令方式连接

代码片段:

代码语言:javascript复制
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("123.56.xx.xx",22,"root", "口令")
#上面的第二行代码的作用是允许连接不在know_hosts文件中的主机。
print(ssh.exec_command("ps"))
方式二

使用账号 密码方式连接

代码片段:

代码语言:javascript复制
import paramiko
t = paramiko.Transport(("127.0.0.1",22))
t.connect(username = "xxxx", password = "xxxxx")
print(t.sys.platform)
方式三

使用秘钥连接,需要两台机器互相提前信任。

客户端的"id_rsa.pub"文件加入到被连接的服务器的"authorized_keys"文件中。

如果没有的,需要手动创建,放到".ssh"文件目录下。

代码片段:

代码语言:javascript复制
import paramiko

SSH_PRIVATE_KEY = '/Users/xinxi/.ssh/id_rsa'  # 本地密钥文件路径
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
ssh.connect(hostname='123.56.xx.xx', port=22, username='root', pkey=key)

我比较推荐用第三种方式,因为现在一般公司级测试环境服务器,运维部门是不提供服务器的密码,会统一使用"跳板机"登陆服务器,所以只能使用秘钥连接方式。

基本操作

单条命令

可以打印出当前目录文件, exec_command中可以放"Linux命令"。

代码语言:javascript复制
stdin, stdout, stderr = ssh.exec_command("ls")
# 获取命令结果
result = stdout.read()
# 打印输出
print(result.decode())
多条命令

日常工作中,会切换到某个目录下,再进行多个连续命令。

paramiko对于执行多条指令,需要使用;分割。

代码语言:javascript复制
stdin, stdout, stderr = ssh.exec_command("cd /data;pwd;ls")
# 获取命令结果
result = stdout.read()
# 打印输出
print(result.decode())
上传文件

获取SFTP实例,调用put方法,本地文件和远程文件。

代码语言:javascript复制
# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
# 设置上传的本地/远程文件路径
localpath = "/Users/xinxi/Desktop/scp_test.py"
remotepath = "/data/test1.py"
# 执行上传动作
sftp.put(localpath, remotepath)
# 关闭链接
tran.close()
下载文件

获取SFTP实例,调用get方法,远程文件和本地文件。

代码语言:javascript复制
# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
# 设置上传的本地/远程文件路径
localpath = "/Users/xinxi/Desktop/scp_test.py"
remotepath = "/data/test1.py"
# 执行下载动作
sftp.get(remotepath, localpath)
# 关闭链接
tran.close()

小结

paramiko对于和多台服务器执行shell交互命令,是一个不错的解决方案。另外在测试过程中经常会遇到需要将本地的自动化测试报告上传到远程服务器上,或者需要将服务器上的自动化测试报告拉到本地进行操作。

paramiko提供的易用性、便利性,极大提高工作效率~

0 人点赞