IOError: [Errno 2] No such file - Paramiko put()

两盒软妹~` 提交于 2019-12-01 16:27:11

问题


I'm uploading a file via SFTP using Paramiko with sftp.put(localFile, remoteFile). I make the necessary directory first if needed with

    makeCommand = 'mkdir -p "' + remotePath + '"'
    ssh.exec_command(makeCommand)

this was works sometimes but I'm occasionally getting the following error:

    sftp.put(localFile, remoteFile)
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 565, in put
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 245, in open
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 635, in _request
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 682, in _read_response
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 708, in _convert_status
    IOError: [Errno 2] No such file 

despite the fact that the local file definitely exists (and localFile is the correct path to it) and the remote path is made. There is discussion here and here on a similar problem but none of the points raised there have helped me. My server supports the df -hi command. Has anyone any advice on this or a possible solution?

EDIT

After suggestions below I tried changing the working directory with sftp.chdir(remoteDirectory) but this call produced the exact same error as above. So it seems this isn't just an upload issue. Any ideas?


回答1:


It seems to be a remote folder permission problem. Although the remote folder was made before the file was uploaded, it appears the permissions on the folder were preventing an upload.

The problem is linked to this issue - if I set open permissions on the folder I'll be uploading to before I upload, the program can upload fine. Although for a permission issue I should be getting IOError: [Errno 13] Permission denied, since I made the changes I haven't encountered any errors.

I'm not sure if it's the response the server is giving Paramiko which is the issue, or a bug in Paramiko itself which is causing IOError: [Errno 2] No such file instead of a Errno 13, but this appears to have solved the problem.




回答2:


The IOError is local, so (for whatever reason) it seems that your local python cannot find localFile. Safety checking this before the call might help tracking down the problem:

if os.path.isfile(localFile):
    sftp.put(localFile, remoteFile)
else:
    raise IOError('Could not find localFile %s !!' % localFile)

If you're positive that localFile does exist, then this could just be a path problem - is localFile on an absolute or relative path? Either way, the if statement above will catch it.

EDIT

Tracing through the paramiko files shows that line 245 of sftp_client.py (the one throwing the exception) is actually

fr = self.file(remotepath, 'wb')

which is quite misleading as paramiko throws an IOError for a remote file! My best guess now is that remoteFile is either a missing directory or a directory you don't have access to.

Out of interest, can you list the remote dir

sftp.listdir(path=os.path.dirname(remoteFile))

to check that it's there (or maybe it's there and you can write to it)?




回答3:


Are you sure the directory has been created and it is your remote working directory? Paramiko has its own methods for creating new directories and navigating the remote file system. Consider using something like:

sftp.mkdir(remotedirectory)
sftp.chdir(remotedirectory)
sftp.put(localfile, remotefile)


来源:https://stackoverflow.com/questions/15481934/ioerror-errno-2-no-such-file-paramiko-put

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!