Python - Upload files to sftp using ssh keys


  1. End result. Upload two files to sftp server.

    Files have been uploaded to sftp successfully.

  2. Create a virtual environment and activate.

    $ python3 -m venv venv
    $ source venv/bin/activate
  3. Install dependencies.

    (venv) $ pip install python-dotenv
    (venv) $ pip install wheel
        Package wheel is required due to error below while installing pysftp.
        error: invalid command 'bdist_wheel'
        ERROR: Failed building wheel for pysftp
    (venv) $ pip install pysftp
  4. Generate private and public keys.

    (venv) $ ssh-keygen -t rsa -b 4096 -C "demo for"
        Generating public/private rsa key pair.
        Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): # Enter
        Enter passphrase (empty for no passphrase): # Enter
        Enter same passphrase again: # Enter
        Your identification has been saved in /home/ubuntu/.ssh/id_rsa
        Your public key has been saved in /home/ubuntu/.ssh/
        The key fingerprint is:
        SHA256:1xO35pPIcmQtvxTCUmy3rwX6FnladZpbDUk3F5UG254 demo for
        The key's randomart image is:
        +---[RSA 4096]----+
        |             ...=|
        |           .  ++o|
        |            =o++o|
        |           = =+o+|
        |        S o O BE+|
        |         . = X===|
        |          . = *Bo|
        |           o o+= |
        |             .+  |
  5. Confirm keys are generated.

    (venv) $ ls ~/.ssh/id_*
    /home/ubuntu/.ssh/id_rsa  /home/ubuntu/.ssh/
  6. Copy private key to root within VS code.

    (venv) $ cp ~/.ssh/id_rsa .
  7. Restart ssh service.

    (venv) $ sudo service ssh restart
  8. Rename public key to authorized_keys.

    (venv) $ cat ~/.ssh/ >> ~/.ssh/authorized_keys
  9. Edit sshd_config to allow to use keys.

    (venv) $ sudo vi /etc/ssh/sshd_config
        Click Insert key
        Uncomment AuthorizedKeysFile
            AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
        Click Esc then type :wq
  10. Restart ssh service.

    (venv) $ sudo service ssh restart
  11. Create a target folder "sftp" on the server.

    (venv) $ mkdir ~/sftp
  12. Create .env file to enter host and credentials.

  13. Create a new python file and paste below code. eg)

    import os
    from pathlib import Path
    from typing import List
    import pysftp
    from dotenv import load_dotenv
    def file_list() -> List[str]:
        return [str(path) for path in Path().glob('data/*.*')] # path for all files in data folder
    def main():
        sftp_host = os.getenv("SFTP_IPADDRESS")
        sftp_userid = os.getenv("SFTP_USERID")
        sftp_private_key = os.getenv("SFTP_PRIVATE_KEY")
            with pysftp.Connection(host=sftp_host, username=sftp_userid, private_key=sftp_private_key, port=22, cnopts=cnopts) as sftp:
                    for file in file_list():
                    print('Files have been uploaded to sftp successfully.')
            print('Upload has failed.')
    if __name__ == '__main__':
  14. Run Ctrl + F5 or Right click >> "Run Python File in Terminal" within VS Code.


taeheechoi © 2023