Net :: SFTP :: Session无法运行stat,显然有一个Nil通道

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Net :: SFTP :: Session无法运行stat,显然有一个Nil通道相关的知识,希望对你有一定的参考价值。

所以我有一些代码检查远程SFTP服务器上是否有某个文件:

def size
    adapter.sftp.stat(path).size
end

其中sftp是Net :: SFTP :: Session对象,在本例中定义为

@sftp = Net::SFTP.start(host, username, password: password)

path是我要调用stat()的对象的文件路径。

不幸的是,当我尝试执行此代码时,我收到此错误:

NoMethodError:
   undefined method `send_data' for nil:NilClass
 # /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/session.rb:814:in `send_packet'
 # /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/protocol/base.rb:45:in `send_request'
 # /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/protocol/01/base.rb:90:in `open'
 # /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/session.rb:830:in `request'
 # /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/session.rb:182:in `open'
 # /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/session.rb:191:in `open!'
 # /usr/local/lib/ruby/gems/2.2.0/gems/net-sftp-2.1.2/lib/net/sftp/operations/file_factory.rb:40:in `open'
 # /Users/Ben/remote_filesystem/lib/remote_filesystem/path/sftp.rb:46:in `size'
 # ./sftp_spec.rb:72:in `block (3 levels) in <top (required)>'

根据我在Qazxswpoi的第814行查看Net :: SFTP :: Session的源代码,可以看出,session.rb被调用,但显然我的SFTP Session由于某种原因有一个Nil通道。任何人都可以解释如何解决这个问题?

答案

如果您正在缓存channel.send_data,则缓存可能已失效。我遇到了这个例外,因为我试图在不再开放的sftp连接上调用ftp.file.open

另一答案

如前所述,这意味着您的SFTP会话已终止。

检查TCP日志(wireshark是你的朋友),同时会话对端终止会话。

发生此类错误的情况是您正在执行写入(数据)操作,其数据长度超过接收端的TCP窗口大小。修复就是用缓冲区重复写操作,比如

ftp

以上是关于Net :: SFTP :: Session无法运行stat,显然有一个Nil通道的主要内容,如果未能解决你的问题,请参考以下文章

无法让 SFTP 在 PHP 中工作

纯干货!python 在运维中的应用 (一):批量 ssh/sftp

JSch SFTP 安全性与 session.setConfig("StrictHostKeyChecking", "no");

ASP.NET里的Session详细解释

Perl“Net::SFTP”模块的 SFTP 连接失败

sudo 的 WinSCP 登录问题