Python Paramiko模块详解:SSH连接与SFTP文件传输实战

木白
木白
发布时间:2026-10-13| 3人浏览过
原创

本文详细介绍Python中Paramiko模块的使用方法,涵盖基于用户名密码和公钥秘钥的两种SSH连接方式,以及SFTPClient实现的文件上传下载功能。通过具体代码示例,演示如何执行远程命令、管理SSH会话及封装常用操作类,帮助开发者快速掌握远程服务器自动化运维技能。

Paramiko是一个使用Python语言编写的模块,它遵循SSH2协议,支持以加密和认证的方式连接远程服务器。该模块兼容Linux、Solaris、BSD、MacOS X及Windows等平台,允许通过SSH协议从一个平台连接到另一个平台。利用Paramiko,开发者可以方便地进行SSH连接,并通过SFTP协议实现文件传输。

在深入使用之前,我们需要明确几个核心概念:

SSHClient:这是对Channel、Transport和SFTPClient的高级封装。 Channel:类似于Socket对象,代表一种安全的SSH传输通道。 Transport:代表一个加密的会话(此时Session尚未完全建立),它创建了一个名为Channel的加密隧道。 Session:是客户端与服务器保持连接的对象,通过connect()、start_client()或start_server()方法启动会话。

Paramiko的详细文档参考地址为:http://docs.paramiko.org/en/2.0/index.html

安装与下载步骤如下:

由于Paramiko模块内部依赖pycrypto,因此需要先安装并下载pycrypto。

执行以下命令进行安装: pip3 install pycrypto pip3 install paramiko

接下来介绍具体的模块使用场景。

关于SSHClient的使用:

远程连接主要分为两种类型:(1)基于用户名和密码的连接;(2)基于公钥和私钥的连接。

通过Paramiko进行远程操作的本质也分为两种路径:(1)直接使用SSHClient;(2)手动创建一个Transport对象。

第一种情况:基于用户名和密码的连接。

import paramiko
 
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='host', port=22, username='root', password='123')
# 执行命令  stdout命令结果,stderr错误
stdin, stdout, stderr = ssh.exec_command('ls')
# 获取命令结果 
result = stdout.read()
# 关闭连接
ssh.close()

SSHClient内部封装了Transport对象,简化了连接过程。

import paramiko
 
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='root', password='123')
 
ssh = paramiko.SSHClient()
ssh._transport = transport
 
stdin, stdout, stderr = ssh.exec_command('df')
print(stdout.read())
 
transport.close()

第二种情况:基于公钥和私钥的连接。

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='host', port=22, username='root', key=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()

同样,SSHClient内部封装了Transport对象来处理密钥认证。

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='wupeiqi', pkey=private_key)
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('df')
transport.close()

关于SFTPClient的使用:

SFTPClient主要用于连接远程服务器,并执行文件的上传和下载操作。

第一种场景:基于用户名和密码进行文件的上传与下载。

import paramiko
 
transport = paramiko.Transport(('hostname',22))
transport.connect(username='root',password='123')
 
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')
 
transport.close()

第二种场景:基于公钥和私钥进行文件的上传与下载。

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
 
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='root', pkey=private_key )
 
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')
 
transport.close()

综合示例:实现远程命令执行和文件上传功能。

import paramiko
 
class SSHConnection(object):
 
  def __init__(self, host='192.168.12.68', port=22, username='locojoy',pwd='123321QQ!'):
    self.host = host
    self.port = port
    self.username = username
    self.pwd = pwd
    self.__k = None
 
  def run(self):
    self.connect() # 连接远程服务器
    self.upload('db.py','/tmp/1.py') # 将本地的db.py文件上传到远端服务器的/tmp/目录下并改名为1.py
    self.cmd('df') # 执行df 命令
    self.close()  # 关闭连接
 
  def connect(self):
    transport = paramiko.Transport((self.host, self.port))
    transport.connect(username=self.username, password=self.pwd)
    self.__transport = transport
 
  def close(self):
    self.__transport.close()
 
  def upload(self,local_path,target_path):
    sftp = paramiko.SFTPClient.from_transport(self.__transport)
    sftp.put(local_path,target_path)
 
  def cmd(self, command):
    ssh = paramiko.SSHClient()
    ssh._transport = self.__transport
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command(command)
    # 获取命令结果
    result = stdout.read()
    print(result)
    return result
 
obj = SSHConnection()
obj.run()


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。