7.1 SSH协议的Python实现paramiko

paramiko是一个Python的库,该库实现了SSHv2协议,我们可以利用这个库,在Python代码中直接使用SSH协议对远程服务器执行操作。

7.1.1 paramiko的安装

使用pip安装:

pip install paramiko

7.1.2 SSHClient类与SFTPClient类

paramiko库包含两个核心的类,SSHClient类和SFTPClient类,前者的作用相当于在Linux下的ssh命令,是对SSH会话的封装,通常用于执行远程命令。后者的作用相当于Linux下的sftp命令,可以实现远程文件操作,例如文件上传,下载,修改文件权限等操作。

SSHClient类的主要方法:

  • connect方法:实现远程服务器的连接与认证。
  • exec_command方法:在远程服务器执行Linux命令。
  • open_sftp方法:在当前ssh会话的基础上创建一个sftp会话。

SFTPClient类的主要方法:

  • put:上传文件到远程服务器。
  • get:从远程服务器上下载文件到本地。
  • mkdir:在远程服务器上创建目录。
  • remove:删除远程服务器上的文件。
  • rmdir:删除远程服务器上的目录。
  • rename:重命名远程服务器上的目录或文件。
  • stat:获取远程服务器中文件的详细信息。
  • listdir:列出远程服务器指定目录下的内容。

7.1.3 paramiko的基本使用

基于用户名密码连接:

import paramiko

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在known_hosts文件上的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname="192.168.31.199", port=22, username="root", password="123456")
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取结果
result = stdout.read().decode()
# 获取错误提示(stdout、stderr只会输出其中一个)
err = stderr.read()
# 关闭连接
ssh.close()
print(stdin, result, err)

结果为:

<paramiko.ChannelFile from <paramiko.Channel 0 (closed) -> <paramiko.Transport at 0x87c004a8 (unconnected)>>> 文件系统          1K-块    已用     可用 已用% 挂载点
udev             466364       0   466364    0% /dev
tmpfs             98588    6324    92264    7% /run
/dev/sda1      19478204 5725044 12740680   32% /
tmpfs            492924     112   492812    1% /dev/shm
tmpfs              5120       0     5120    0% /run/lock
tmpfs            492924       0   492924    0% /sys/fs/cgroup
tmpfs             98588      80    98508    1% /run/user/1000
/dev/sr0        1586144 1586144        0  100% /media/liu/Ubuntu
16.04.4 LTS amd64
tmpfs             98588       0    98588    0% /run/user/0
 b''

实现SFTP功能

import paramiko
# 连接虚拟机centos上的ip及端口
transport = paramiko.Transport(("192.168.31.199", 22))
transport.connect(username="root", password="123456")
# 将实例化的Transport作为参数传入SFTPClient中
sftp = paramiko.SFTPClient.from_transport(transport)
# 文件上传
sftp.put(r'D:\Projects\test\test.txt', '/root/test.txt')
# 文件下载
sftp.get('/root/01-argv.py', r'D:\Projects\test\download\01-argv.py')
transport.close()