Python 使用pysftp将bucket文件发送到FTP服务器

Python 使用pysftp将bucket文件发送到FTP服务器,python,google-cloud-functions,sftp,pysftp,Python,Google Cloud Functions,Sftp,Pysftp,我正在尝试使用pysftp将文件从bucket发送到FTP服务器 为此,我在python 3.7中使用Google云函数 我尝试过很多不同的方法,但总是有错误 1.-:在本例中,为了避免文件内容出错,我将创建一个包含“测试字符串”的文件,而不是使用bucket文件中的内容 def sftp_handler(): myHostname = "hotsname.com" myUsername = "username" myPassword = "pass" try:

我正在尝试使用pysftp将文件从bucket发送到FTP服务器

为此,我在python 3.7中使用Google云函数

我尝试过很多不同的方法,但总是有错误

1.-:在本例中,为了避免文件内容出错,我将创建一个包含“测试字符串”的文件,而不是使用bucket文件中的内容

def sftp_handler():
    myHostname = "hotsname.com"
    myUsername = "username"
    myPassword = "pass"
    try:
        keydata = b"""AAAAB..."""
        key = paramiko.RSAKey(data=decodebytes(keydata))
        cnopts = pysftp.CnOpts()
        cnopts.hostkeys.add('hotname.com', 'ssh-rsa', key)
        with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword,port=22,cnopts=cnopts) as sftp:
            print ("Connection succesfully stablished ... ")
            remoteFilePath = '/dir1/dir2/dir3/'
            sftp.putfo(StringIO('test string'), os.path.join(remoteFilePath, "OC.csv"))            
        # connection closed automatically at the end of the with-block
    except:
        print("Unexpected error in sftp_handler:")
        traceback.print_exc()
错误输出(stackdriver日志)

2.-我将从桶中写入文件的内容

<adding this to the previous code>
with tempfile.NamedTemporaryFile(suffix='.csv', prefix=os.path.basename(__file__)) as tf:
      tf.write(b'Hello world!')
      remoteFilePath = '/dir1/dir2/dir3/'
      sftp.put(os.path.dirname(tf.name), os.path.join(remoteFilePath, "OC.csv"))
3.-正如马丁在回答中所建议的:

    with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword,port=22,cnopts=cnopts) as sftp:
        print ("Connection succesfully stablished ... ")
        remoteFilePath = '/dir1/dir2/dir3/'
        sftp.putfo(StringIO('test string'), remoteFilePath + "OC.csv")
我得到以下错误:

 Traceback (most recent call last): E  
   File "/user_code/main.py", line 36, in sftp_handler E  
     sftp.putfo(StringIO('test string'), remoteFilePath + "OC.csv") E  
   File "/env/local/lib/python3.7/site-packages/pysftp/__init__.py", line 474, in putfo E  
     callback=callback, confirm=confirm) E  
   File "/env/local/lib/python3.7/site-packages/paramiko/sftp_client.py", line 714, in putfo E  
     with self.file(remotepath, "wb") as fr: E  
   File "/env/local/lib/python3.7/site-packages/paramiko/sftp_client.py", line 372, in open E  
     t, msg = self._request(CMD_OPEN, filename, imode, attrblock) E  
   File "/env/local/lib/python3.7/site-packages/paramiko/sftp_client.py", line 813, in _request E  
     return self._read_response(num) E  
   File "/env/local/lib/python3.7/site-packages/paramiko/sftp_client.py", line 865, in _read_response E  
     self._convert_status(msg) E  
   File "/env/local/lib/python3.7/site-packages/paramiko/sftp_client.py", line 898, in _convert_status E  
     raise IOError(text) E  
 OSError E 
4.-从bucket下载文件,在执行云函数时创建一个文件,并将该文件发送到sftp(尚未实现,因为我不确定在云函数中创建文件是否有效)


  • 我怎么能做到这一点
  • 为什么失败

  • 注意:我还尝试使用FileZilla,但也有一个错误,因此这应该与FTP服务器有关:

    09:00:46    Status: Connecting to sftp-staging.messagesnetwork.com...
    09:01:06    Status: Connected to sftp-staging.messagesnetwork.com
    09:01:06    Status: Retrieving directory listing...
    09:01:06    Status: Listing directory /
    09:01:07    Status: Directory listing of "/" successful
    09:01:11    Status: Retrieving directory listing of "/folder1"...
    09:01:37    Command:    cd "folder1"
    09:01:37    Response:   New directory is: "/folder1"
    09:01:37    Command:    ls
    09:01:37    Error:  Connection timed out after 20 seconds of inactivity
    09:01:38    Error:  Failed to retrieve directory listing
    09:01:38    Status: Disconnected from server
    09:01:38    Status: Connecting to sftp-staging.messagesnetwork.com...
    09:02:04    Status: Connected to sftp-staging.messagesnetwork.com
    09:02:09    Status: Retrieving directory listing of "/folder1"...
    09:02:10    Status: Listing directory /folder1
    09:02:10    Status: Directory listing of "/folder1" successful
    09:02:12    Status: Retrieving directory listing of "/folder1/folder2"...
    09:02:21    Status: Listing directory /folder1/folder2
    09:02:23    Status: Directory listing of "/folder1/folder2" successful
    09:02:24    Status: Retrieving directory listing of "/folder1/folder2/folder3"...
    09:02:25    Status: Listing directory /folder1/folder2/folder3
    09:02:26    Status: Directory listing of "/folder1/folder2/folder3" successful
    09:02:30    Status: Connecting to sftp-staging.messagesnetwork.com...
    09:02:41    Status: Connected to sftp-staging.messagesnetwork.com
    09:02:45    Status: Starting upload of <...>\Desktop\folder2cf.txt
    09:02:59    Command:    cd "/folder1/folder2/folder3"
    09:02:59    Response:   New directory is: "/folder1/folder2/folder3"
    09:02:59    Command:    put "<...>\Desktop\folder2cf.txt" "folder2cf.txt"
    09:02:59    Error:  /folder1/folder2/folder3/folder2cf.txt: open for write: failure
    09:02:59    Error:  File transfer failed
    09:02:59    Status: Starting upload of <...>\Desktop\folder2cf.txt
    09:02:59    Status: Retrieving directory listing of "/folder1/folder2/folder3"...
    09:02:59    Status: Listing directory /folder1/folder2/folder3
    09:03:11    Command:    put "<...>\Desktop\folder2cf.txt" "folder2cf.txt"
    09:03:11    Error:  /folder1/folder2/folder3/folder2cf.txt: open for write: failure
    09:03:11    Error:  File transfer failed
    09:03:11    Status: Starting upload of <...>\Desktop\folder2cf.txt
    09:03:11    Status: Retrieving directory listing of "/folder1/folder2/folder3"...
    09:03:11    Status: Listing directory /folder1/folder2/folder3
    09:03:34    Command:    put "<...>\Desktop\folder2cf.txt" "folder2cf.txt"
    09:03:34    Error:  /folder1/folder2/folder3/folder2cf.txt: open for write: failure
    09:03:34    Error:  File transfer failed
    09:03:34    Status: Retrieving directory listing of "/folder1/folder2/folder3"...
    09:03:39    Status: Listing directory /folder1/folder2/folder3
    09:03:44    Status: Directory listing of "/folder1/folder2/folder3" successful
    
    09:00:46状态:连接到sftp staging.messagesnetwork.com。。。
    09:01:06状态:已连接到sftp-staging.messagesnetwork.com
    09:01:06状态:正在检索目录列表。。。
    09:01:06状态:正在列出目录/
    09:01:07状态:“/”目录列表成功
    09:01:11状态:正在检索“/folder1”的目录列表。。。
    09:01:37命令:cd“folder1”
    09:01:37响应:新目录为:“/folder1”
    09:01:37命令:ls
    09:01:37错误:20秒不活动后连接超时
    09:01:38错误:检索目录列表失败
    09:01:38状态:已断开与服务器的连接
    09:01:38状态:正在连接到sftp staging.messagesnetwork.com。。。
    09:02:04状态:已连接到sftp-staging.messagesnetwork.com
    09:02:09状态:正在检索“/folder1”的目录列表。。。
    09:02:10状态:正在列出目录/folder1
    09:02:10状态:“/folder1”的目录列表成功
    09:02:12状态:正在检索“/folder1/folder2”的目录列表。。。
    09:02:21状态:正在列出目录/folder1/folder2
    09:02:23状态:“/folder1/folder2”的目录列表成功
    09:02:24状态:正在检索“/folder1/folder2/folder3”的目录列表。。。
    09:02:25状态:正在列出目录/folder1/folder2/folder3
    09:02:26状态:“/folder1/folder2/folder3”目录列表成功
    09:02:30状态:正在连接到sftp staging.messagesnetwork.com。。。
    09:02:41状态:已连接到sftp-staging.messagesnetwork.com
    09:02:45状态:开始上载\Desktop\folder2cf.txt
    09:02:59命令:cd“/folder1/folder2/folder3”
    09:02:59响应:新目录为:“/folder1/folder2/folder3”
    09:02:59命令:放置“\Desktop\folder2cf.txt”“folder2cf.txt”
    09:02:59错误:/folder1/folder2/folder3/folder2cf.txt:打开进行写入:失败
    09:02:59错误:文件传输失败
    09:02:59状态:开始上载\Desktop\folder2cf.txt
    09:02:59状态:正在检索“/folder1/folder2/folder3”的目录列表。。。
    09:02:59状态:正在列出目录/folder1/folder2/folder3
    09:03:11命令:放置“\Desktop\folder2cf.txt”“folder2cf.txt”
    09:03:11错误:/folder1/folder2/folder3/folder2cf.txt:打开进行写入:失败
    09:03:11错误:文件传输失败
    09:03:11状态:开始上载\Desktop\folder2cf.txt
    09:03:11状态:正在检索“/folder1/folder2/folder3”的目录列表。。。
    09:03:11状态:正在列出目录/folder1/folder2/folder3
    09:03:34命令:放置“\Desktop\folder2cf.txt”“folder2cf.txt”
    09:03:34错误:/folder1/folder2/folder3/folder2cf.txt:打开进行写入:失败
    09:03:34错误:文件传输失败
    09:03:34状态:正在检索“/folder1/folder2/folder3”的目录列表。。。
    09:03:39状态:正在列出目录/folder1/folder2/folder3
    09:03:44状态:“/folder1/folder2/folder3”目录列表成功
    
    如果这是真正的问题,我不能说是atm,但您不应该使用
    path.join
    作为SFTP路径。SFTP始终使用正斜杠
    path.join
    使用本地操作系统的分隔符。它可能不同(特别是在Windows上)

    代码应为:

    remoteFilePath = '/dir1/dir2/dir3/'
    sftp.putfo(StringIO('test string'), remoteFilePath + "OC.csv")
    

    在这里使用
    path.dirname
    很有意义。您希望上载文件,因此必须提供要上载的文件的路径,而不是其包含文件夹的路径


    路径也有同样的问题。加入之前的

    谢谢Martin。以前我使用:
    sftp.put(StringIO('teststring')、os.path.join(“/dir1/dir2/dir3/OC.csv”)
    进行了测试,但出现了一个错误,现在我尝试了您的:
    sftp.putfo(StringIO('teststring')、remoteFilePath+“OC.csv”)
    ,所以我认为您的选项(也是我的)很好,但我遇到了一个错误,我不知道为什么。我将上传带有错误日志的主要帖子。您是否可以使用任何(GUI)SFTP客户端将文件上载到
    /dir1/dir2/dir3/OC.csv
    ?给我们看一个日志文件。这应该是FTP服务器的错误,因为我已经尝试了Filezilla,我也得到了相同的错误。在它工作前几天,所以我会询问FTP
    09:00:46    Status: Connecting to sftp-staging.messagesnetwork.com...
    09:01:06    Status: Connected to sftp-staging.messagesnetwork.com
    09:01:06    Status: Retrieving directory listing...
    09:01:06    Status: Listing directory /
    09:01:07    Status: Directory listing of "/" successful
    09:01:11    Status: Retrieving directory listing of "/folder1"...
    09:01:37    Command:    cd "folder1"
    09:01:37    Response:   New directory is: "/folder1"
    09:01:37    Command:    ls
    09:01:37    Error:  Connection timed out after 20 seconds of inactivity
    09:01:38    Error:  Failed to retrieve directory listing
    09:01:38    Status: Disconnected from server
    09:01:38    Status: Connecting to sftp-staging.messagesnetwork.com...
    09:02:04    Status: Connected to sftp-staging.messagesnetwork.com
    09:02:09    Status: Retrieving directory listing of "/folder1"...
    09:02:10    Status: Listing directory /folder1
    09:02:10    Status: Directory listing of "/folder1" successful
    09:02:12    Status: Retrieving directory listing of "/folder1/folder2"...
    09:02:21    Status: Listing directory /folder1/folder2
    09:02:23    Status: Directory listing of "/folder1/folder2" successful
    09:02:24    Status: Retrieving directory listing of "/folder1/folder2/folder3"...
    09:02:25    Status: Listing directory /folder1/folder2/folder3
    09:02:26    Status: Directory listing of "/folder1/folder2/folder3" successful
    09:02:30    Status: Connecting to sftp-staging.messagesnetwork.com...
    09:02:41    Status: Connected to sftp-staging.messagesnetwork.com
    09:02:45    Status: Starting upload of <...>\Desktop\folder2cf.txt
    09:02:59    Command:    cd "/folder1/folder2/folder3"
    09:02:59    Response:   New directory is: "/folder1/folder2/folder3"
    09:02:59    Command:    put "<...>\Desktop\folder2cf.txt" "folder2cf.txt"
    09:02:59    Error:  /folder1/folder2/folder3/folder2cf.txt: open for write: failure
    09:02:59    Error:  File transfer failed
    09:02:59    Status: Starting upload of <...>\Desktop\folder2cf.txt
    09:02:59    Status: Retrieving directory listing of "/folder1/folder2/folder3"...
    09:02:59    Status: Listing directory /folder1/folder2/folder3
    09:03:11    Command:    put "<...>\Desktop\folder2cf.txt" "folder2cf.txt"
    09:03:11    Error:  /folder1/folder2/folder3/folder2cf.txt: open for write: failure
    09:03:11    Error:  File transfer failed
    09:03:11    Status: Starting upload of <...>\Desktop\folder2cf.txt
    09:03:11    Status: Retrieving directory listing of "/folder1/folder2/folder3"...
    09:03:11    Status: Listing directory /folder1/folder2/folder3
    09:03:34    Command:    put "<...>\Desktop\folder2cf.txt" "folder2cf.txt"
    09:03:34    Error:  /folder1/folder2/folder3/folder2cf.txt: open for write: failure
    09:03:34    Error:  File transfer failed
    09:03:34    Status: Retrieving directory listing of "/folder1/folder2/folder3"...
    09:03:39    Status: Listing directory /folder1/folder2/folder3
    09:03:44    Status: Directory listing of "/folder1/folder2/folder3" successful
    
    sftp.putfo(StringIO('test string'), os.path.join(remoteFilePath, "OC.csv"))
    
    remoteFilePath = '/dir1/dir2/dir3/'
    sftp.putfo(StringIO('test string'), remoteFilePath + "OC.csv")
    
    sftp.put(os.path.dirname(tf.name), os.path.join(remoteFilePath, "OC.csv"))