Ruby Net-SFTP无响应

4

我试图使用Net::SFTP将文件上传到SFTP站点,但问题是Ruby进程从未返回。它被冻结,卡住了,永远不会结束......我必须Ctrl-C才能停止它。

  • 我可以使用sftp在命令行中连接到ftp服务器。
  • 我在Linux(Ubuntu)和Snow Leopard上尝试过此代码,结果相同。
  • 安装了最新版本的Net::SSH和Net::SFTP。
    • gem list net
      • net-sftp (2.0.5)
      • net-ssh (2.1.4)
  • 不同的哈希参数组合(参见下面的代码)
  • 尝试调用Net::SFTP.start而不是先创建SSH会话。
  • 当我使用命令行工具登录并要求版本时,服务器响应为“SFTP协议版本3”。
  • 我正在运行Ruby 1.8.7(2010-08-16 patchlevel 302)[i686-darwin10.7.0]

:verbose的调试输出(最后几行):

D, [2011-07-29T17:30:52.692192 #19399] DEBUG -- tcpsocket[80c06478]: read 36 bytes
D, [2011-07-29T17:30:52.692609 #19399] DEBUG -- tcpsocket[80c06478]: received packet nr 7 type 99 len 12
I, [2011-07-29T17:30:52.692751 #19399]  INFO -- net.ssh.connection.session[80bd5da0]: channel_success: 0
D, [2011-07-29T17:30:52.692817 #19399] DEBUG -- net.sftp.session[80bd5c24]: sftp subsystem successfully started
D, [2011-07-29T17:30:52.693625 #19399] DEBUG -- tcpsocket[80c06478]: queueing packet nr 8 type 94 len 28
D, [2011-07-29T17:30:52.693834 #19399] DEBUG -- tcpsocket[80c06478]: sent 52 bytes

示例代码:

require 'rubygems'
require 'net/sftp'

FTP = "someftpsite"
FTP_USER_NAME = "user"
FTP_PASSWORD = "password"
hash = {:password => FTP_PASSWORD, :verbose => :debug, :keys=>[""],:auth_methods => ["password"], :timeout => 5, :port=>22}
begin
    Net::SSH.start(FTP,FTP_USER_NAME, hash) do |test|
    test.sftp.upload!("localfile","remotefile")
end
rescue Exception => err
    puts "error:#{err.inspect}"
end

修改:8/22/2011

这似乎与SFTP服务器的互动性有关。我通过创建一个使用expect的shell脚本,并从Ruby中外壳运行该文件来解决了这个问题。该shell脚本是在运行时创建的。这似乎非常简陋,但这是我使用Ruby使其工作的唯一方法。如果其他人有建议,我很乐意找到更好的方法来解决这个问题。


1
可能服务器认证设置为交互式,这需要在程序中以不同的方式处理登录... 我不是 Ruby 专家,所以无法告诉您如何在 Ruby 中完成此操作。 - Yahia
Yahia,是的,我认为你走在了正确的道路上。 - user498023
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接