当我们需要将本地的文件或文件夹上传到远程服务器中时,可以使用sftp协议实现。下面是Python使用sftp实现传文件夹和文件的完整攻略。
安装paramiko库
paramiko是Python中的一款SSH客户端,可以方便地实现ssh和sftp协议的连接,进行文件传输。我们需要先安装paramiko库。
pip install paramiko
连接服务器
我们需要通过paramiko库创建一个ssh连接,通过这个连接来进行文件传输。下面是连接服务器的示例代码。
import paramiko
# 建立ssh连接
transport = paramiko.Transport(('hostname', port))
transport.connect(username='username', password='password')
# 创建sftp实例
sftp = paramiko.SFTPClient.from_transport(transport)
# 关闭连接
transport.close()
其中,hostname
是服务器的IP地址或域名,port
是ssh服务器的端口号,默认是22。username
是登录服务器的用户名,password
是密码,如果使用密钥登录的话,则需要使用paramiko.RSAKey.from_private_key_file(key_filename)
来加载私钥文件。
上传文件
上传文件的过程非常简单,只需要使用sftp.put()方法,传入本地文件路径和远程服务器的文件路径即可。下面是上传文件的示例代码。
import paramiko
# 建立ssh连接
transport = paramiko.Transport(('hostname', port))
transport.connect(username='username', password='password')
# 创建sftp实例
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件
sftp.put(local_path, remote_path)
# 关闭连接
transport.close()
其中,local_path
是本地文件的路径,remote_path
是远程服务器上的文件路径。
上传文件夹
上传文件夹需要用到递归函数,递归地将文件夹中的所有文件都上传到远程服务器上。下面是上传文件夹的示例代码。
import os
import paramiko
# 建立ssh连接
transport = paramiko.Transport(('hostname', port))
transport.connect(username='username', password='password')
# 创建sftp实例
sftp = paramiko.SFTPClient.from_transport(transport)
def upload(local_path, remote_path):
"""
上传文件夹或文件到远程服务器
"""
if os.path.isfile(local_path):
# 是文件
sftp.put(local_path, remote_path)
else:
# 是文件夹
try:
sftp.stat(remote_path)
except FileNotFoundError:
sftp.mkdir(remote_path)
for file in os.listdir(local_path):
sub_local_path = os.path.join(local_path, file)
sub_remote_path = os.path.join(remote_path, file)
upload(sub_local_path, sub_remote_path)
upload(local_path, remote_path)
# 关闭连接
transport.close()
其中,os.path.isfile(local_path)
用于判断当前路径是否是文件,若是,则使用sftp.put()
方法上传文件,若不是,则遍历文件夹中的所有文件,递归上传。
示例说明
示例1: 上传单个文件
假设我们要上传本地的/home/user/test.txt
文件到远程服务器的/data/test.txt
路径下。代码如下:
import paramiko
# 建立ssh连接
transport = paramiko.Transport(('192.168.1.100', 22))
transport.connect(username='root', password='password')
# 创建sftp实例
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件
sftp.put('/home/user/test.txt', '/data/test.txt')
# 关闭连接
transport.close()
运行代码后,test.txt
文件将被上传到远程服务器的/data/test.txt
路径下。
示例2: 上传文件夹
假设我们要上传/home/user/folder
文件夹下的所有文件到远程服务器的/data/folder
路径下。代码如下:
import os
import paramiko
# 建立ssh连接
transport = paramiko.Transport(('192.168.1.100', 22))
transport.connect(username='root', password='password')
# 创建sftp实例
sftp = paramiko.SFTPClient.from_transport(transport)
def upload(local_path, remote_path):
"""
上传文件夹或文件到远程服务器
"""
if os.path.isfile(local_path):
# 是文件
sftp.put(local_path, remote_path)
else:
# 是文件夹
try:
sftp.stat(remote_path)
except FileNotFoundError:
sftp.mkdir(remote_path)
for file in os.listdir(local_path):
sub_local_path = os.path.join(local_path, file)
sub_remote_path = os.path.join(remote_path, file)
upload(sub_local_path, sub_remote_path)
upload('/home/user/folder', '/data/folder')
# 关闭连接
transport.close()
运行代码后,/home/user/folder
文件夹下的所有文件都将被上传到远程服务器的/data/folder
路径下。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python使用sftp实现传文件夹和文件 - Python技术站