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