无法在SFTP中识别上载的文件

时间:2019-08-29 18:25:22

标签: python sftp pysftp

我正在使用pysftp上传本地文件,该文件将进行远程处理,然后返回到SFTP,从中可以下载它。目前,我无法获得识别已上传处理过的远程文件的代码。尽管成功处理了远程处理的文件,但代码只是永远等待。

代码正在运行时,如果我刷新诸如FileZilla之类的服务上的连接,则代码会立即识别出文件已插入并且运行正常。但是,我需要它在不手动刷新FileZilla的情况下工作。我不确定为什么代码无法识别出文件已经上传并且可以下载了。

我已经尝试使用while语句断开连接,然后重新连接到SFTP,但操作不成功。

import pysftp
import stat

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
srv = pysftp.Connection(host="host", username="username", password="passowrd", cnopts=cnopts)

print("Connection Made!")

# Put File In
srv.chdir(r'/path_to_remote_directory')

srv.put(r'C:\Path_to_local_file.csv')
print("File Uploaded")

while not srv.isfile(r'/Path_to_newly_uploaded_remote_file.csv'):
    time.sleep(3)
    print("Still Waiting")

if srv.isfile(r'/Path_to_newly_uploaded_remote_file.csv'):
    print("File is Ready!")
    srv.get('/Path_to_newly_uploaded_remote_file.csv', r'C:\Local_path_save_to/file.csv')

    # Closes the connection
    srv.close()

2 个答案:

答案 0 :(得分:1)

只需删除/

srv.isfile(r'/Path_to_newly_uploaded_remote_file.csv'):
     ->
srv.isfile(r'Path_to_newly_uploaded_remote_file.csv'):

注意:

  

不要设置cnopts.hostkeys = None,   除非您不在乎安全性。您失去了防范   这样做是对中间人的攻击。<​​/ p>

我在pysftp github fork中实现了auto_add_key

auto_add_key将把密钥添加到known_hosts,如果auto_add_key=True
known_hosts中为主机提供密钥后,将对其进行检查。

有关安全性问题,请参阅Martin Prikryl-> answer

Why using context manager is a good approach

import pysftp
with pysftp.Connection(host, username="whatever", password="whatever", auto_add_key=True) as sftp:
    #do your stuff here
#connection closed

编辑: 请检查我的代码并/是问题所在……请检查文件的拼写,并且您位于正确的工作目录getcwd() _

import pysftp
import stat
import time

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None #do not do this !!!
srv = pysftp.Connection("host", username="user", password="pass", cnopts=cnopts)

print("Connection Made!")

# Put File In
srv.chdir(r'/upload')

srv.put(r'C:\Users\Fabian\Desktop\SFTP\testcsv.csv')
print("File Uploaded")

print(srv.getcwd()) #get the current folder ! <- you should looking here

while not srv.isfile(r'testcsv.csv'):
    time.sleep(3)
    print("Still Waiting")

if srv.isfile(r'testcsv.csv'):
    print("File is Ready!")
    srv.get('testcsv.csv', r'C:\Users\Fabian\Desktop\SFTP\testcsv_new.csv')

    # Closes the connection
    srv.close()

答案 1 :(得分:0)

找到了可行的解决方案。我认为这是由于旧目录被缓存导致的。通过每次都指向新目录进行更新,它似乎可以工作。现在的解决方案很明显,但花了我一段时间。发布,以防其他人碰到这个。

while not srv.isfile(r'/Path_to_newly_uploaded_remote_file.csv'):
    time.sleep(3)
    srv.chdir(r'/Path_to_newly_uploaded_remote_file')
    print("Still Waiting")