Python Paramiko模块详解:SSH连接与SFTP文件传输实战
本文详细介绍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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









