本文将介绍如何使用Python从Linux服务器上递归下载文件夹下的所有文件。我们将使用paramiko库来实现SSH连接,以及os和shutil库来处理文件和目录。如果你还没有安装paramiko库,请先使用以下命令安装:
pip install paramiko
1. 创建SSH连接
首先创建一个SSH连接到Linux服务器:
import paramiko
def create_ssh_client(hostname, port, username, password):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, port, username, password)
return client
2. 递归下载文件夹下的所有文件
编写一个函数来递归下载文件夹下的所有文件。这个函数将接收一个SSH客户端对象、一个远程文件夹路径和一个本地保存路径作为参数。
import os
import shutil
def download_folder(ssh_client, remote_folder, local_folder):
# 在远程服务器上创建本地文件夹(如果不存在)
sftp = ssh_client.open_sftp()
sftp.mkdir(local_folder) if not os.path.exists(local_folder) else None
sftp.close()
# 在远程服务器上获取文件夹列表
stdout, _ = ssh_client.exec_command(f"ls -lR {remote_folder}")
folder_list = [line.split()[-1] for line in stdout.readlines()]
# 遍历文件夹列表并递归下载每个文件
for file in folder_list:
remote_file = f"{remote_folder}/{file}"
local_file = f"{local_folder}/{file}"
sftp.get(remote_file, local_file) if os.path.isfile(remote_file) else None
download_folder(ssh_client, remote_file, local_file) if os.path.isdir(remote_file) else None
3. 使用示例
整体调用这些函数来从Linux服务器上递归下载文件夹下的所有文件。假设我们的服务器地址为example.com,端口为22,用户名为user,密码为password,我们想要下载的远程文件夹为/remote/folder,并将其保存到本地的/local/folder中。
if __name__ == "__main__":
hostname = "example.com"
port = 22
username = "user"
password = "password"
remote_folder = "/remote/folder"
local_folder = "/local/folder"
ssh_client = create_ssh_client(hostname, port, username, password)
download_folder(ssh_client, remote_folder, local_folder)
运行上述代码后,在本地的/local/folder中可以看到远程服务器上的/remote/folder文件夹及其内容。