Python Paramiko创建文件目录并上传文件详解

 更新时间:2024年10月23日 14:06:56   作者:傻啦嘿哟  
Paramiko是一个用于进行SSH2会话的Python库,它支持加密、认证和文件传输等功能,本文旨在详细指导新手朋友如何使用Python的Paramiko库来创建远程文件目录并上传文件,希望对大家有所帮助

引言

在网络运维和自动化领域,SSH(Secure Shell)协议是连接和管理远程服务器的常用手段。而Paramiko是一个用于进行SSH2会话的Python库,它支持加密、认证和文件传输等功能。使用Paramiko,可以方便地实现远程命令执行、文件上传下载等操作。本文旨在详细指导新手朋友如何使用Python的Paramiko库来创建远程文件目录并上传文件。

一、安装Paramiko

首先,确保你已经安装了Paramiko库。如果没有安装,可以通过pip轻松完成:

pip install paramiko

安装完成后,在Python脚本中导入所需的模块:

import paramiko

二、创建SSH连接

在开始任何操作之前,需要创建一个SSH客户端实例,并配置相关参数。以下是一个基本示例:

ssh_client = paramiko.SSHClient()  
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 自动添加主机密钥

接下来,使用服务器的IP地址、端口号、用户名和密码来连接到远程服务器:

ssh_client.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')

三、创建远程文件目录

一旦连接成功,你就可以通过执行SSH命令来创建文件目录。以下是一个简单的示例,展示如何创建一个名为my_directory的新目录:

command = "mkdir my_directory"  
stdin, stdout, stderr = ssh_client.exec_command(command)  
print("Directory created:", stdout.read().decode())

另外,你也可以通过SFTP会话来创建目录,Paramiko提供了一个SFTP客户端,可以很方便地进行文件传输和目录管理。以下是一个通过SFTP创建目录的示例:

sftp_client = ssh_client.open_sftp()  
try:  
    remote_path = '/path/to/your/folder/subfolder'  
    sftp_client.makedirs(remote_path)  # 这里会自动创建多级目录  
except IOError as e:  
    print(f"Error creating remote directory: {e}")  
finally:  
    sftp_client.close()  
    ssh_client.close()

四、上传文件

要上传文件,可以使用Paramiko的SFTPClient类的put()方法。该方法接受两个参数:本地文件路径和远程文件路径。以下示例将本地文件/tmp/file.txt上传到远程服务器的/home/user/目录:

sftp_client = ssh_client.open_sftp()  
try:  
    local_file_path = '/tmp/file.txt'  
    remote_file_path = '/home/user/file.txt'  
    sftp_client.put(local_file_path, remote_file_path)  
    print('File uploaded successfully')  
except FileNotFoundError:  
    print("Local file not found!")  
except PermissionError:  
    print("No permission to upload the file!")  
except Exception as e:  
    print("An error occurred:", str(e))  
finally:  
    sftp_client.close()  
    ssh_client.close()

在实际操作过程中,可能会遇到各种异常,比如文件不存在、权限问题等。因此,合理地处理异常是非常重要的。

五、下载文件

要下载文件,可以使用Paramiko的SFTPClient类的get()方法。该方法接受两个参数:远程文件路径和本地文件路径。以下示例将远程服务器的/home/user/file.txt文件下载到本地的/tmp/目录:

sftp_client = ssh_client.open_sftp()  
try:  
    remote_file_path = '/home/user/file.txt'  
    local_file_path = '/tmp/file.txt'  
    sftp_client.get(remote_file_path, local_file_path)  
    print('File downloaded successfully')  
except FileNotFoundError:  
    print("Remote file not found!")  
except PermissionError:  
    print("No permission to download the file!")  
except Exception as e:  
    print("An error occurred:", str(e))  
finally:  
    sftp_client.close()  
    ssh_client.close()

六、上传和下载文件夹

要上传文件夹,可以使用Paramiko的SFTPClient类的put()方法来逐个上传文件,也可以使用put_recursive()方法来递归上传文件夹。以下示例将本地文件夹/tmp/folder递归上传到远程服务器的/home/user/目录:

import os  
  
def upload_folder(local_folder_path, remote_folder_path):  
    sftp_client = ssh_client.open_sftp()  
    try:  
        for root, dirs, files in os.walk(local_folder_path):  
            remote_current_path = remote_folder_path + root[len(local_folder_path):].strip(os.sep)  
            if not sftp_client.listdir(remote_current_path):  
                sftp_client.makedirs(remote_current_path)  
            for file in files:  
                local_file_path = os.path.join(root, file)  
                remote_file_path = os.path.join(remote_current_path, file)  
                sftp_client.put(local_file_path, remote_file_path)  
        print('Folder uploaded successfully')  
    except Exception as e:  
        print("An error occurred:", str(e))  
    finally:  
        sftp_client.close()  
        ssh_client.close()  
  
upload_folder('/tmp/folder', '/home/user/')

要下载文件夹,可以使用Paramiko的SFTPClient类的get()方法来逐个下载文件,也可以使用get_recursive()方法来递归下载文件夹。以下示例将远程服务器的/home/user/folder文件夹递归下载到本地的/tmp/目录:

import os  
  
def download_folder(remote_folder_path, local_folder_path):  
    sftp_client = ssh_client.open_sftp()  
    try:  
        if not os.path.exists(local_folder_path):  
            os.makedirs(local_folder_path)  
        for filename in sftp_client.listdir(remote_folder_path):  
            remote_file_path = os.path.join(remote_folder_path, filename)  
            local_file_path = os.path.join(local_folder_path, filename)  
            if sftp_client.stat(remote_file_path).st_mode & 0o170000 == 0o040000:  # 如果是文件夹  
                download_folder(remote_file_path, local_file_path)  
            else:  
                sftp_client.get(remote_file_path, local_file_path)  
        print('Folder downloaded successfully')  
    except Exception as e:  
        print("An error occurred:", str(e))  
    finally:  
        sftp_client.close()  
        ssh_client.close()  
  
download_folder('/home/user/folder', '/tmp/')

七、异常处理和高级功能

在实际操作过程中,可能会遇到各种异常,比如文件不存在、权限问题等。因此,合理地处理异常是非常重要的。此外,在某些场景下,网络不稳定或者文件较大时,断点续传和错误重试功能就显得尤为重要。

你可以通过设置put方法的resumable参数为True来实现断点续传(需要注意的是,Paramiko本身并不直接支持断点续传,这里仅作为一个可能的扩展思路),并通过循环和异常处理来实现错误重试。

以下是一个带有错误重试机制的上传文件示例:

import time  
  
def upload_file_with_retry(local_file_path, remote_file_path, retries=3, delay=2):  
    sftp_client = ssh_client.open_sftp()  
    attempt = 0  
    while attempt < retries:  
        try:  
            sftp_client.put(local_file_path, remote_file_path)  
            print('File uploaded successfully')  
            return  
        except Exception as e:  
            print(f"Attempt {attempt + 1} failed: {str(e)}")  
            attempt += 1  
            if attempt < retries:  
                time.sleep(delay)  
        finally:  
            sftp_client.close()  
    ssh_client.close()  
    print('Failed to upload file after retries')  
  
upload_file_with_retry('/tmp/file.txt', '/home/user/file.txt')

八、总结

通过本文的指导,你现在应该能够使用Python的Paramiko库来创建远程文件目录并上传文件。这些技能不仅能够提高你的工作效率,还能够让你在自动化运维的道路上更进一步。记得在实际操作中多加练习,以便更好地掌握这些有用的工具。

此外,敏感信息如服务器地址、用户名和密码应妥善保管,不应在公开场合泄露。

到此这篇关于Python Paramiko创建文件目录并上传文件详解的文章就介绍到这了,更多相关Python Paramiko创建文件目录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python判断回文数的三种方法实例

    Python判断回文数的三种方法实例

    这篇文章主要给大家介绍了关于Python判断回文数的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • python 调制解调的实现

    python 调制解调的实现

    在Python中,可以使用SciPy和NumPy库来处理信号,包括进行FM信号的解调,本文主要介绍了python 调制解调的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法

    Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法

    这篇文章主要介绍了Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法,涉及Python3使用tarfile模块实现tar压缩文件的技巧,需要的朋友可以参考下
    2015-05-05
  • python process模块的使用简介

    python process模块的使用简介

    在python中大部分情况需要使用多进程,python提供了multiprocessing模块。multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。本文将着重讲解process模块的使用
    2021-05-05
  • 解决Mac安装scrapy失败的问题

    解决Mac安装scrapy失败的问题

    今天小编就为大家分享一篇解决Mac安装scrapy失败的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python中IP地址处理IPy模块的方法

    Python中IP地址处理IPy模块的方法

    这篇文章主要介绍了Python中IP地址处理IPy模块的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Python获取女友聊天记录详细流程

    Python获取女友聊天记录详细流程

    就在前段时间,在大学睡我上铺的兄弟,在兄嘚群里讨论,说:他发现女朋友这几天只要下班就坐在电脑前,不是工作原因。而且只要他靠近一点就会立即退出页面,所以他一直很怀疑,在群里问我们这一个个单身狗。然后就出现下面这一段对话
    2021-10-10
  • python3.8+django2+celery5.2.7环境准备(python测试开发django)

    python3.8+django2+celery5.2.7环境准备(python测试开发django)

    这篇文章主要介绍了python测试开发django之python3.8+django2+celery5.2.7环境准备工作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Python如何在单元测试中给对象打补丁

    Python如何在单元测试中给对象打补丁

    这篇文章主要介绍了Python如何在单元测试中给对象打补丁,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • Python 数据结构之队列的实现

    Python 数据结构之队列的实现

    这篇文章主要介绍了Python 数据结构之队列的实现的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论