Python 使用pysftp将bucket文件发送到FTP服务器
我正在尝试使用pysftp将文件从bucket发送到FTP服务器 为此,我在python 3.7中使用Google云函数 我尝试过很多不同的方法,但总是有错误 1.-:在本例中,为了避免文件内容出错,我将创建一个包含“测试字符串”的文件,而不是使用bucket文件中的内容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:
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"))