简体   繁体   English

Capistrano:NoMethodError:#的未定义方法`recv&#39; <IO:fd XX>

[英]Capistrano : NoMethodError: undefined method `recv' for #<IO:fd XX>

This error in Capistrano (> 3) prevents me from deploying my Rails application. Capistrano(> 3)中的此错误阻止我部署我的Rails应用程序。 My Capistrano config works fine on another environment. 我的Capistrano配置在另一个环境中运行良好。

DEBUG [6c7d7bed] Command: if test ! -d /opt/my_app/releases/20140429175529; then echo "Directory does not exist '/opt/my_app/releases/20140429175529'" 1>&2; false; fi
cap aborted!
NoMethodError: undefined method `recv' for #<IO:fd 49>
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/buffered_io.rb:65:in `fill'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/packet_stream.rb:86:in `next_packet'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:178:in `block in poll_message'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:173:in `loop'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:173:in `poll_message'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:210:in `block in wait'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:208:in `loop'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:208:in `wait'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:87:in `initialize'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh.rb:200:in `new'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/net-ssh-2.8.0/lib/net/ssh.rb:200:in `start'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/connection_pool.rb:24:in `create_or_reuse_connection'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:173:in `ssh'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:126:in `block in _execute'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:123:in `tap'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:123:in `_execute'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:66:in `execute'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/abstract.rb:75:in `within'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/capistrano-3.2.1/lib/capistrano/tasks/deploy.rake:207:in `block (3 levels) in <top (required)>'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:54:in `instance_exec'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:54:in `run'
/Users/such/.rvm/gems/ruby-2.1.1@my_app/gems/sshkit-1.4.0/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute'
Tasks: TOP => deploy:set_current_revision
(See full trace by running task with --trace)
The deploy has failed with an error: #<NoMethodError: undefined method `recv' for #<IO:fd 49>>

I'm using a proxy to connect to my remote servers (on both environment). 我正在使用代理连接到我的远程服务器(在两个环境中)。 SSH connection is working perfectly. SSH连接工作正常。

set :ssh_options, proxy: Net::SSH::Proxy::Command.new('ssh user@gateway -W %h:%p')

Has anyone ever experienced this issue? 有没有人遇到过这个问题?

Workaround 解决方法

My weak understanding of the error is that after the ssh negotiation, sometimes the socket returned to net-ssh is a file descriptor which is unexpected. 我对错误的理解是,在ssh协商之后,有时返回net-ssh的套接字是一个意外的文件描述符。 I have added: 我已经添加了:

gem 'sshkit', github: 'msimonin/sshkit', branch: 'gateway'

to my Gemfile so that the ssh connection is only established once. 到我的Gemfile,以便ssh连接只建立一次。

Related configuration is: 相关配置是:

SSHKit.config.backend.configure do |ssh|
  ssh.gateway = 'user@gateway'
end

It works fine this way. 它以这种方式工作正常。 I can't wait for the pull request to be merged. 我迫不及待地想要合并拉取请求。

The connection objects are always a file descriptor-backed IO instance if you're using proxy commands. 如果您正在使用代理命令,则连接对象始终是文件描述符支持的IO实例。 The code lives in lib/net/ssh/proxy/command.rb and it injects the recv method right after the bit that popens the pipes and waits for something to become readable, so I'm not sure why it sometimes fails (I've seen it too). 代码存在于lib / net / ssh / proxy / command.rb中,并且它会在管道旁边注入recv方法并等待某些东西变得可读,因此我不确定为什么它有时会失败(我'我也看过它了。 Based on the callstack, I think it has returned already, so recv should be there. 基于callstack,我认为它已经返回了,所以recv应该在那里。

Have you opened an issue? 你有没有问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 NoMethodError:未定义的方法`map&#39;for:roles:Capistrano 3中的符号 - NoMethodError: undefined method `map' for :roles:Symbol in Capistrano 3 NoMethodError(#的未定义方法“页面” <Broadcast:0x00000003fd9320> ): - NoMethodError (undefined method `page' for #<Broadcast:0x00000003fd9320>): Capistrano:NoMethodError:“ ec2私有ip”的未定义方法“合并”:字符串 - Capistrano :NoMethodError: undefined method `merge' for“ec2 private ip”:String NoMethodError:使用 Capistrano 部署时为 nil:NilClass 未定义的方法“拆分” - NoMethodError: undefined method `split' for nil:NilClass when deploying with Capistrano ` <module:Types> &#39;:#的未定义方法`/&#39; <String:0x007fd44c8f5318> (NoMethodError)数据映射器 - `<module:Types>': undefined method `/' for #<String:0x007fd44c8f5318> (NoMethodError) Datamapper NoMethodError:未定义的方法“ liquidity_manager?” 对于# <Order:0x007fd9b7a4cf98> - NoMethodError: undefined method `liquidity_manager?' for #<Order:0x007fd9b7a4cf98> Rails 错误:NoMethodError:Capistrano::Configuration:Class 的未定义方法`instance&#39; 你的意思是? 实例的? - Rails Error: NoMethodError: undefined method `instance' for Capistrano::Configuration:Class Did you mean? instance_of? NoMethodError: nil:NilClass / 'additional_paths' [capistrano+webpacker] 的未定义方法`+' - NoMethodError: undefined method `+' for nil:NilClass / 'additional_paths' [capistrano+webpacker] NoMethodError,未定义的方法“出价” - NoMethodError, undefined method 'bid' Rails-NoMethodError:未定义的方法 - Rails - NoMethoderror: Undefined method
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM