<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=Sftp_get_dirs</id>
	<title>Sftp get dirs - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=Sftp_get_dirs"/>
	<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=Sftp_get_dirs&amp;action=history"/>
	<updated>2026-04-24T08:02:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://tech.uvoo.io/index.php?title=Sftp_get_dirs&amp;diff=5555&amp;oldid=prev</id>
		<title>Busk: Created page with &quot;# Simple script to get dirs  .env ``` export SFTP_HOST=eft-na.wtwco.com export SFTP_USER=PooBear export SFTP_PASS=&lt;MY PASS&gt; export BASE_DIR=&quot;/Usr/BDA/&quot; export OUTPUT_FILE=&quot;my_...&quot;</title>
		<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=Sftp_get_dirs&amp;diff=5555&amp;oldid=prev"/>
		<updated>2025-06-19T20:20:07Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;# Simple script to get dirs  .env ``` export SFTP_HOST=eft-na.wtwco.com export SFTP_USER=PooBear export SFTP_PASS=&amp;lt;MY PASS&amp;gt; export BASE_DIR=&amp;quot;/Usr/BDA/&amp;quot; export OUTPUT_FILE=&amp;quot;my_...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;# Simple script to get dirs&lt;br /&gt;
&lt;br /&gt;
.env&lt;br /&gt;
```&lt;br /&gt;
export SFTP_HOST=eft-na.wtwco.com&lt;br /&gt;
export SFTP_USER=PooBear&lt;br /&gt;
export SFTP_PASS=&amp;lt;MY PASS&amp;gt;&lt;br /&gt;
export BASE_DIR=&amp;quot;/Usr/BDA/&amp;quot;&lt;br /&gt;
export OUTPUT_FILE=&amp;quot;my_end_dir_results.txt&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
sudo apt install python3-venv&lt;br /&gt;
python3 -m venv . ~/.venv&lt;br /&gt;
. ~/.venv/bin/activate&lt;br /&gt;
pip install pysftp&lt;br /&gt;
.env&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
sftp-get-dirs.py&lt;br /&gt;
```&lt;br /&gt;
import pysftp&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import stat  # to interpret file types&lt;br /&gt;
&lt;br /&gt;
def list_remote_directories_recursive(sftp, remote_path, log_fn):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Recursively lists all directories under a given remote path,&lt;br /&gt;
    calling log_fn(path) for each directory found.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    try:&lt;br /&gt;
        with sftp.cd(remote_path):&lt;br /&gt;
            for item in sftp.listdir_attr('.'):&lt;br /&gt;
                if stat.S_ISDIR(item.st_mode) and item.filename not in ('.', '..'):&lt;br /&gt;
                    sub_path = f&amp;quot;{sftp.pwd}/{item.filename}&amp;quot;&lt;br /&gt;
                    log_fn(sub_path)&lt;br /&gt;
                    list_remote_directories_recursive(sftp, sub_path, log_fn)&lt;br /&gt;
&lt;br /&gt;
    except pysftp.exceptions.PermissionDenied:&lt;br /&gt;
        print(f&amp;quot;Permission denied to access: {remote_path}&amp;quot;)&lt;br /&gt;
    except pysftp.exceptions.NoSuchFile:&lt;br /&gt;
        # remote_path was a file, skip it&lt;br /&gt;
        pass&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;An error occurred processing '{remote_path}': {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # --- env vars ---&lt;br /&gt;
    HOSTNAME   = os.environ.get(&amp;quot;SFTP_HOST&amp;quot;)&lt;br /&gt;
    USERNAME   = os.environ.get(&amp;quot;SFTP_USER&amp;quot;)&lt;br /&gt;
    PASSWORD   = os.environ.get(&amp;quot;SFTP_PASS&amp;quot;)&lt;br /&gt;
    BASE_DIR   = os.environ.get(&amp;quot;BASE_DIR&amp;quot;)&lt;br /&gt;
    OUTPUT_FILE = os.environ.get(&amp;quot;OUTPUT_FILE&amp;quot;, &amp;quot;directory_list.txt&amp;quot;)&lt;br /&gt;
    PORT       = 22  # default SFTP port&lt;br /&gt;
&lt;br /&gt;
    if not all([HOSTNAME, USERNAME, PASSWORD, BASE_DIR]):&lt;br /&gt;
        print(&amp;quot;Error: Please set SFTP_HOST, SFTP_USER, SFTP_PASS, and BASE_DIR environment variables.&amp;quot;)&lt;br /&gt;
        sys.exit(1)&lt;br /&gt;
&lt;br /&gt;
    sftp_connection = None&lt;br /&gt;
    try:&lt;br /&gt;
        # open output file&lt;br /&gt;
        with open(OUTPUT_FILE, 'w', encoding='utf-8') as output_fh:&lt;br /&gt;
            def log_dir(path):&lt;br /&gt;
                print(path)&lt;br /&gt;
                output_fh.write(path + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            print(f&amp;quot;Saving directory list to: {OUTPUT_FILE}\n&amp;quot;)&lt;br /&gt;
            print(f&amp;quot;Connecting to {HOSTNAME} with user {USERNAME}...&amp;quot;)&lt;br /&gt;
            cnopts = pysftp.CnOpts()&lt;br /&gt;
            cnopts.hostkeys = None  # disable hostkey checking for dev&lt;br /&gt;
&lt;br /&gt;
            sftp_connection = pysftp.Connection(&lt;br /&gt;
                host=HOSTNAME,&lt;br /&gt;
                username=USERNAME,&lt;br /&gt;
                password=PASSWORD,&lt;br /&gt;
                port=PORT,&lt;br /&gt;
                cnopts=cnopts&lt;br /&gt;
            )&lt;br /&gt;
            print(&amp;quot;Successfully connected to the SFTP server.\n&amp;quot;)&lt;br /&gt;
            print(&amp;quot;Scanning starting from:&amp;quot;, BASE_DIR)&lt;br /&gt;
            log_dir(BASE_DIR)  # include the base itself&lt;br /&gt;
            list_remote_directories_recursive(sftp_connection, BASE_DIR, log_dir)&lt;br /&gt;
            print(&amp;quot;\nScan complete.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;A critical error occurred: {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    finally:&lt;br /&gt;
        if sftp_connection:&lt;br /&gt;
            sftp_connection.close()&lt;br /&gt;
            print(&amp;quot;SFTP connection closed.&amp;quot;)&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Busk</name></author>
	</entry>
</feed>