Sftp get dirs

From UVOO Tech Wiki
Revision as of 20:20, 19 June 2025 by Busk (talk | contribs) (Created page with "# Simple script to get dirs .env ``` export SFTP_HOST=eft-na.wtwco.com export SFTP_USER=PooBear export SFTP_PASS=<MY PASS> export BASE_DIR="/Usr/BDA/" export OUTPUT_FILE="my_...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Simple script to get dirs

.env

export SFTP_HOST=eft-na.wtwco.com
export SFTP_USER=PooBear
export SFTP_PASS=<MY PASS>
export BASE_DIR="/Usr/BDA/"
export OUTPUT_FILE="my_end_dir_results.txt"
sudo apt install python3-venv
python3 -m venv . ~/.venv
. ~/.venv/bin/activate
pip install pysftp
.env

sftp-get-dirs.py

import pysftp
import os
import sys
import stat  # to interpret file types

def list_remote_directories_recursive(sftp, remote_path, log_fn):
    """
    Recursively lists all directories under a given remote path,
    calling log_fn(path) for each directory found.
    """
    try:
        with sftp.cd(remote_path):
            for item in sftp.listdir_attr('.'):
                if stat.S_ISDIR(item.st_mode) and item.filename not in ('.', '..'):
                    sub_path = f"{sftp.pwd}/{item.filename}"
                    log_fn(sub_path)
                    list_remote_directories_recursive(sftp, sub_path, log_fn)

    except pysftp.exceptions.PermissionDenied:
        print(f"Permission denied to access: {remote_path}")
    except pysftp.exceptions.NoSuchFile:
        # remote_path was a file, skip it
        pass
    except Exception as e:
        print(f"An error occurred processing '{remote_path}': {e}")

if __name__ == "__main__":
    # --- env vars ---
    HOSTNAME   = os.environ.get("SFTP_HOST")
    USERNAME   = os.environ.get("SFTP_USER")
    PASSWORD   = os.environ.get("SFTP_PASS")
    BASE_DIR   = os.environ.get("BASE_DIR")
    OUTPUT_FILE = os.environ.get("OUTPUT_FILE", "directory_list.txt")
    PORT       = 22  # default SFTP port

    if not all([HOSTNAME, USERNAME, PASSWORD, BASE_DIR]):
        print("Error: Please set SFTP_HOST, SFTP_USER, SFTP_PASS, and BASE_DIR environment variables.")
        sys.exit(1)

    sftp_connection = None
    try:
        # open output file
        with open(OUTPUT_FILE, 'w', encoding='utf-8') as output_fh:
            def log_dir(path):
                print(path)
                output_fh.write(path + "\n")

            print(f"Saving directory list to: {OUTPUT_FILE}\n")
            print(f"Connecting to {HOSTNAME} with user {USERNAME}...")
            cnopts = pysftp.CnOpts()
            cnopts.hostkeys = None  # disable hostkey checking for dev

            sftp_connection = pysftp.Connection(
                host=HOSTNAME,
                username=USERNAME,
                password=PASSWORD,
                port=PORT,
                cnopts=cnopts
            )
            print("Successfully connected to the SFTP server.\n")
            print("Scanning starting from:", BASE_DIR)
            log_dir(BASE_DIR)  # include the base itself
            list_remote_directories_recursive(sftp_connection, BASE_DIR, log_dir)
            print("\nScan complete.")

    except Exception as e:
        print(f"A critical error occurred: {e}")

    finally:
        if sftp_connection:
            sftp_connection.close()
            print("SFTP connection closed.")