【问题标题】:Upload file to SFTP directly without storing it into local system [duplicate]直接将文件上传到SFTP而不将其存储到本地系统[重复]
【发布时间】:2021-10-14 15:56:29
【问题描述】:

我正在尝试加密文件,然后使用 python 将加密文件直接上传到 SFTP。

目前,我首先将加密文件存储到本地系统,然后将其推送到 SFTP。是否可以直接将其推送到 SFTP 而不将其存储到我的本地系统中?

【问题讨论】:

    标签: python sftp paramiko pysftp


    【解决方案1】:

    加密

    加密并发送文件到远程服务器(encrypt_and_send.py):

    from cryptography.fernet import Fernet
    from io import BytesIO
    import pysftp
    from time import sleep
    
    secret_key = b'fj6IO3olXODT7Z2xWjFoJkzg0qztYIkPtf-wDXwnwpY='
    
    fernet = Fernet(secret_key)
    
    with open('data.txt', 'rb') as file:
      original_data = file.read()
    
    print('Data to encode:')
    print(original_data.decode('utf-8'))
    
    encrypted_data = fernet.encrypt(original_data)
    
    print('Encrypted data:')
    print(encrypted_data.decode('utf-8'))
    
    file_like_object = BytesIO(encrypted_data)
    
    with pysftp.Connection(host="192.168.1.18", username="root", password="password", log="/tmp/pysftp.log") as sftp:
      file_like_object.seek(0)
      sftp.putfo(file_like_object, 'output.txt')
    
    print('sent')
    

    输出:

    Data to encode:
    a
    b
    c
    d
    e
    f
    
    Encrypted data:
    gAAAAABhE4sAq5iHkZ36H_vbVuBdlGrtLrQNpAXe-utbZT_JOHxnb1FipftlLiZcCO7AnkX_CEF4bz1oZk-CC57ubStE7u6k-w==
    sent
    

    解密

    在远程机器上读取数据 (decrypt.py)

    from cryptography.fernet import Fernet
    
    secret_key = b'fj6IO3olXODT7Z2xWjFoJkzg0qztYIkPtf-wDXwnwpY='
    
    fernet = Fernet(secret_key)
      
    with open('output.txt', 'rb') as enc_file:
        encrypted = enc_file.read()
     
    print(fernet.decrypt(encrypted).decode('utf-8'))
    

    输出:

    a
    b
    c
    d
    e
    f
    
    

    其他信息

    当我使用pysftp==0.2.9 运行此脚本时出现异常:

    Exception ignored in: <function Connection.__del__ at 0x102941f70>
    Traceback (most recent call last):
      File "/.../lib/python3.9/site-packages/pysftp/__init__.py", line 1013, in __del__
      File "/.../lib/python3.9/site-packages/pysftp/__init__.py", line 795, in close
    ImportError: sys.meta_path is None, Python is likely shutting down
    

    看起来像库问题。
    pysftp==0.2.8传输数据没有任何问题。

    【讨论】:

    • 上传csv文件时可以用同样的方法吗?这表示文件输入应该是字节类型而不是字符串。
    • 当然。 csv 是一个普通的 txt 文件。您必须以二进制模式读取输入文件:with open('data.txt', 'rb') as file: → 'rb' 在我的示例中表示读取二进制。如果你在普通模式下读取文件open(..., 'r'),你需要使用from io import StringIO和file_like_object = StringIO(encrypted_data)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2015-07-13
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多