【问题标题】:Ruby Net::SFTP upload hangsRuby Net::SFTP 上传挂起
【发布时间】:2015-04-30 04:27:50
【问题描述】:

我正在使用 net-sftp gem 将文件上传到 ftp 服务器。这是我的代码:

require "net/sftp"

Net::SFTP.start(url, username, password: password) do |sftp|
  sftp.upload!(file_path, "/")
end

它只是挂在上传行,最终超时并出现错误Net::SSH::Disconnect: connection closed by remote host。我可以使用 FileZilla 使用相同的 url、用户名和密码通过 SFTP 连接。

我也尝试使用verbose: :debug 运行非阻塞版本:

sftp = Net::SFTP.start(test.ftphost.com, ftp_username, password: ftp_password, verbose: :debug)

^ 这产生的输出表明连接良好:

I, [2015-04-29T10:32:51.381339 #25769]  INFO -- net.ssh.connection.session[3fc8a502c24c]: channel_success: 0 D, [2015-04-29T10:32:51.381429 #25769] DEBUG -- net.sftp.session[3fc8a5025d70]: sftp subsystem successfully started

然后我输入了以下内容:

sftp.upload!("/Users/marina/Desktop/test.png", "/")

输出是这样卡住的:

I, [2015-04-29T10:32:55.035471 #25769]  INFO -- net.sftp.session[3fc8a5025d70]: sending open packet (0)
D, [2015-04-29T10:32:55.035740 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: queueing packet nr 12 type 94 len 44
D, [2015-04-29T10:32:55.036149 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: sent 68 bytes
D, [2015-04-29T10:32:55.119070 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: read 52 bytes
D, [2015-04-29T10:32:55.119356 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: received packet nr 11 type 96 len 28
I, [2015-04-29T10:32:55.119470 #25769]  INFO -- net.ssh.connection.session[3fc8a502c24c]: channel_eof: 0
D, [2015-04-29T10:32:55.195747 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: read 120 bytes
D, [2015-04-29T10:32:55.196037 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: received packet nr 12 type 98 len 44
I, [2015-04-29T10:32:55.196176 #25769]  INFO -- net.ssh.connection.session[3fc8a502c24c]: channel_request: 0 exit-status false
D, [2015-04-29T10:32:55.196445 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: received packet nr 13 type 97 len 28
I, [2015-04-29T10:32:55.196527 #25769]  INFO -- net.ssh.connection.session[3fc8a502c24c]: channel_close: 0
D, [2015-04-29T10:32:55.196743 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: queueing packet nr 13 type 97 len 28
D, [2015-04-29T10:32:55.196806 #25769] DEBUG -- net.sftp.session[3fc8a5025d70]: sftp channel closed
D, [2015-04-29T10:32:55.197022 #25769] DEBUG -- tcpsocket[3fc8a4cf464c]: sent 52 bytes

有什么想法吗?

【问题讨论】:

标签: ruby ftp sftp net-sftp


【解决方案1】:

什么是文件路径?

如果您使用的是相对路径,它将相对于应用程序启动的目录。

以下内容可能有用:

Dir.pwd
Dir.entries('.')

也许verbose: debug 会有所帮助。

还有:

我在使用 Net::SFTP.start 时也遇到了问题,不得不使用内联方法。

sftp = Net::SFTP.start(host, username, ssh_session_options)
sftp.upload!(file.path, remote_path)
sftp.session.shutdown!

Github Issue

【讨论】:

  • 我的文件路径如下所示:“/Users/marina/Desktop/test.png”
  • 看起来不错。你可能想用ls /Users/marina/Desktop/test.png检查它
  • 是的,文件路径有效。我用非阻塞版本更新了我的问题,包括verbose: :debug 选项。我已经包含了输出。
  • @Marina 我遇到了同样的问题,我注意到它只挂在 png 文件上。我看到它在你的 png 上也失败了。你有没有运气解决这个问题?
【解决方案2】:

问题是我放置了错误的目标位置。它不应该只是一个目录,而是实际的文件名。所以不要说以下内容

require "net/sftp"

Net::SFTP.start(url, username, password: password) do |sftp|
  sftp.upload!(file_path, "/")
end

我需要添加文件名:

require "net/sftp"

Net::SFTP.start(url, username, password: password) do |sftp|
  sftp.upload!(file_path, "/filename.extension")
end

块语法确实对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多