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

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

本文详细介绍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 相关产品和应用

全部下载

专题列表