本文共 3259 字,大约阅读时间需要 10 分钟。
paramiko 是一个基于 SSH 协议的模块,用于连接远程服务器并执行相关操作。它主要包含两个核心组件:SSHClient 和 SFTPClient。通过 paramiko,可以实现远程服务器的命令执行、文件上传下载等功能。该模块在 fabric 和 ansible 等工具中也被广泛使用,是实现远程管理的重要基础。
在这种方法中,我们直接创建 SSHClient 实例并通过连接参数(如 hostname、username 和 password)建立远程会话。适用于简单的命令执行操作。
# -*- coding: utf-8 -*-import paramiko# 创建 SSH 客户端实例ssh = paramiko.SSHClient()# 允许连接不在 ~/.ssh/known_hosts 文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接到服务器ssh.connect(hostname='xxx.xxx.xxx.xxx', port=22, username='username', password='password')# 执行命令stdin, stdout, stderr = ssh.exec_command('df -h')result = stdout.read()# 输出结果,默认为 bytes 类型print(result.decode(encoding="utf-8"))# 关闭连接ssh.close() 运行该脚本后,会输出远程服务器的磁盘使用情况。
这种方法通过创建 Transport 实例并将其封装到 SSHClient 中,实现了对 SSH 连接的更高级管理。适用于需要长时间保持连接的场景。
# -*- coding: utf-8 -*-import paramiko# 创建 Transport 实例并连接到服务器transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))transport.connect(username='username', password='password')# 创建 SSH 客户端实例,并将现有的 Transport 实例绑定ssh = paramiko.SSHClient()ssh._transport = transport# 执行命令stdin, stdout, stderr = ssh.exec_command('w')result = stdout.read()# 输出结果,默认为 bytes 类型print(result.decode(encoding="utf-8"))# 关闭连接transport.close() 运行该脚本后,会显示远程服务器的系统信息。
在这种方法中,我们使用 RSA 私钥文件实现免密登录,更加安全且灵活。
# -*- coding: utf-8 -*-import paramiko# 读取私钥文件private_key = paramiko.RSAKey.from_private_key_file('/home/username/.ssh/id_rsa')# 创建 Transport 实例并连接到服务器transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))transport.connect(username='username', pkey=private_key)# 创建 SSH 客户端实例,并将现有的 Transport 实例绑定ssh = paramiko.SSHClient()ssh._transport = transport# 执行命令stdin, stdout, stderr = ssh.exec_command('uptime')result = stdout.read()# 输出结果,默认为 bytes 类型print(result.decode(encoding="utf-8"))# 关闭连接transport.close() 运行该脚本后,会显示远程服务器的 uptime 信息。
这种方法使用 SFTPClient 来实现文件的上传和下载操作。
# -*- coding: utf-8 -*-import paramiko# 创建 Transport 实例并连接到服务器transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))transport.connect(username='username', password='password')# 创建 SFTP 客户端实例,并将现有的 Transport 实例绑定sftp = paramiko.SFTPClient.from_transport(transport)# 上传本地文件到服务器local_path = 'E:/GitHub/Python-Learning/work/2018-07-27/auto_task.yml'remote_path = '/tmp/auto_task.yml'sftp.put(local_path, remote_path)# 下载服务器上的文件到本地remote_path = '/root/nohup.out'local_path = 'E:/GitHub/Python-Learning/work/2018-07-27/nohup.out'sftp.get(remote_path, local_path)# 关闭连接transport.close() 运行该脚本后,会将指定文件从本地上传到服务器或从服务器下载到本地。
这种方法同样使用 SFTPClient,但使用私钥文件实现免密登录。
# -*- coding: utf-8 -*-import paramiko# 读取私钥文件private_key = paramiko.RSAKey.from_private_key_file('/home/username/.ssh/id_rsa')# 创建 Transport 实例并连接到服务器transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))transport.connect(username='username', pkey=private_key)# 创建 SFTP 客户端实例,并将现有的 Transport 实例绑定sftp = paramiko.SFTPClient.from_transport(transport)# 上传本地文件到服务器local_path = '/tmp/location.py'remote_path = '/tmp/test.py'sftp.put(local_path, remote_path)# 下载服务器上的文件到本地remote_path = 'remove_path'local_path = 'local_path'sftp.get(remote_path, local_path)# 关闭连接transport.close() 运行该脚本后,会实现文件的上传和下载操作。
转载地址:http://ttvfk.baihongyu.com/