pythondmz

Python - FileNotFoundError when dealing with DMZ


I created a python script to copy files from a source folder to a destination folder, the script runs fine in my local machine.

However, when I tried to change the source to a path located in a server installed in a DMZ and the destination to a folder in a local servers I got the following error:

FileNotFoundError: [WinError 3] The system cannot find the path specified: '\reports'

And Here is the script:

import sys, os, shutil
import glob
import os.path, time

fob= open(r"C:\Log.txt","a")
dir_src = r"\reports"
dir_dst = r"C:\Dest"
dir_bkp = r"C:\Bkp"

for w in list(set(os.listdir(dir_src)) - set(os.listdir(dir_bkp))):
    if w.endswith('.nessus'):
        pathname = os.path.join(dir_src, w)
        Date_File="%s" %time.ctime(os.path.getmtime(pathname))
        print (Date_File)
        if os.path.isfile(pathname):
                        shutil.copy2(pathname, dir_dst)
                        shutil.copy2(pathname, dir_bkp)
                        fob.write("File Name:   %s" % os.path.basename(pathname))
                        fob.write("   Last modified Date:   %s" % time.ctime(os.path.getmtime(pathname)))
                        fob.write("   Copied On:   %s" % time.strftime("%c"))
                        fob.write("\n")

fob.close()
os.system("PAUSE")

Solution

  • Okay, we first need to see what kind of remote folder you have.

    1. If your remote folder is shared windows network folder, try mapping it as a network drive: http://windows.microsoft.com/en-us/windows/create-shortcut-map-network-drive#1TC=windows-7 Then you can just use something like Z:\reports to access your files.

    2. If your remote folder is actually a unix server, you could use paramiko to access it and copy files from it:

    
    import paramiko, sys, os, posixpath, re

    def copyFilesFromServer(server, user, password, remotedir, localdir, filenameRegex = '*', autoTrust=True):
        # Setup ssh connection for checking directory
        sshClient = paramiko.SSHClient()
        if autoTrust:
            sshClient.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #No trust issues! (yes this could potentially be abused by someone malicious with access to the internal network)
        sshClient.connect(server,user,password)
        # Setup sftp connection for copying files
        t = paramiko.Transport((server, 22))
        t.connect(user, password)
        sftpClient = paramiko.SFTPClient.from_transport(t)
        fileList = executeCommand(sshclient,'cd {0}; ls | grep {1}'.format(remotedir, filenameRegex)).split('\n')
        #TODO: filter out empties!
        for filename in fileList:
            try:
                sftpClient.get(posixpath.join(remotedir, filename), os.path.join(localdir, filename), callback=None) #callback for showing number of bytes transferred so far
            except IOError as e:
                print 'Failed to download file <{0}> from <{1}> to <{2}>'.format(filename, remotedir, localdir)
    

    1. If your remote folder is something served with the webdav protocol, I'm just as interested in an answer as you are.

    2. If your remote folder is something else still, please explain. I have not yet found a solution that treats all equally, but I'm very interested in one.