【问题标题】:Capistrano SSH::AuthenticationFailed, not prompting for passwordCapistrano SSH::AuthenticationFailed,不提示输入密码
【发布时间】:2014-02-28 21:12:03
【问题描述】:

我已经成功使用 capistrano 有一段时间了,但突然在每个项目中我都失去了部署能力。

环境:

  • os X(小牛队)
  • 红宝石 1.9.3p194
  • rvm(本地,不在服务器上)
  • rails 3.2 及更高版本
  • RubyGems 1.8.25

我没有使用 rsa_keys 或任何我想让 capistrano 提示输入用户和密码的东西。突然,它决定不询问密码,而是询问用户。然后它回滚并给我以下错误。

[deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: sub.example.com (Net::SSH::AuthenticationFailed: Authentication failed for user user@sub.example.com)
connection failed for: sub.example.com (Net::SSH::AuthenticationFailed: Authentication failed for user user@sub.example.com)

这发生在我的个人笔记本电脑和工作中的 iMac 上。部署到两个不同的服务器(都是 linux)时会发生这种情况

我在这里完全不知所措。有什么想法吗?

【问题讨论】:

  • 您尝试手动登录 ssh 吗?
  • 是的,适用于任何情况
  • 另见此 net-ssh 问题,目前正在讨论该问题:github.com/net-ssh/net-ssh/issues/145
  • 这是 Capistrano 2 还是 3 的问题?对于 Capistrano 3,我相信“使用密码身份验证”的自述文件说:set :password, ask('Server password', nil) server 'server.domain.com', user: 'ssh_user_name', port: 22, password: fetch (:password), roles: %w{web app db} 这样填写密码而不是像以前那样提示是很不方便的:(
  • Setting :password 不能解决 Capistrano 2 中的这个问题,在 net-ssh 2.7 之后,我怀疑这也是 Capistrano 3 的问题。

标签: ruby-on-rails ruby deployment capistrano


【解决方案1】:

想通了!显然这个问题与net-ssh gem 有关。我最近安装了 2.8.0 版,并对我的开发环境进行了一些更新,这就是原因。

我不确定它为什么会失败,但 gem uninstall net-ssh -v 2.8.0< 为我修复了它。

如果有人真的知道为什么会出现这个问题,或者我可以如何使用较新版本的 net-ssh 来纠正这个问题,我很想听听。

【讨论】:

  • 遇到此问题的任何其他人都应该知道,将 net-ssh 锁定在 2.7.0 并将 net-ssh-gateway 锁定在 1.2.0 对我有用。
  • 删除后出现错误:在总共 14 个 gem 中找不到 'net-ssh' (>= 2.0.14) (Gem::LoadError)
  • 卸载 net-ssh 2.8.0 后,请确保您安装了另一个版本以满足其他 gem 依赖项,例如 2.7.0
  • 所以例如运行gem install net-ssh -v 2.7
  • 我在我的 Gemfile 中在 gem 'capistrano', '~>2.15.5' 旁边添加了 gem 'net-ssh', '~>2.7.0',然后运行了 bundle update
【解决方案2】:

由于 gem 依赖,答案可能会破坏您的 Rails 应用程序。

Sparkmasterflex 正确回答了 net-ssh 的问题,但是虽然这会让 capistrano 正常工作,但它可能会破坏你的 rails 应用程序:

这些步骤为我固定了 capistrano 和 rails ...

  1. 在您的 Gemfile 中添加 gem 'net-ssh', '2.7.0'
  2. 运行bundle update net-ssh
  3. 运行bundle(只是为了确保一切正常'
  4. 运行gem uninstall net-ssh -v 2.8.0

如果您是 rails 用户,您现在应该能够同时运行 rails 服务器和 capistrano。

【讨论】:

  • 我按照这些步骤打印了“使用 net-ssh 2.7.0”,但我仍然收到错误:ruby-2.1.2/lib/ruby/2.1.0/rubygems/dependency.rb :298:in `to_specs': 找不到 'net-ssh' (>= 2.8.0) - 确实找到了: [net-ssh-2.7.0] (Gem::LoadError)
  • 这为我解决了这个问题
【解决方案3】:

将您的 net-ssh 版本升级到 2.8.1 将解决问题。他们在 2014 年 2 月 19 日发布了版本更新,修复了这个问题和其他问题。

  1. 卸载当前的 net-ssh gem (gem install net-ssh -v 'version')
  2. 只需将其粘贴到您的 Gemfile 中即可:

    gem 'net-ssh', '~> 2.8.1', :git => "https://github.com/net-ssh/net-ssh"

  3. 运行捆绑安装

【讨论】:

  • 然而,是 net-ssh-2.9.1 为我打破了这一点。所以,如果他们在 2.8.1 中修复了它,他们又把它弄坏了。恢复到旧版本修复了它。
【解决方案4】:

我在使用 capistrano 部署时遇到了同样的问题 Net::SSH::AuthenticationFailed: 用户 deployer@IP 身份验证失败

ssh-copy-id deployer@ip

这会将您的密钥添加到服务器,您无需密码即可登录。

【讨论】:

  • 在mac osx上,你可能需要先brew install ssh-copy-id
  • 这种方式简单多了。始终使用此技术。 :)
  • 这与问题无关。信不信由你,在某些组织中,主动密码保护是一项要求。
【解决方案5】:

这个 sn-p 对我有用:

group :development do
  #.....
  gem 'capistrano', "~> 2.15"
  gem "net-ssh", "~> 2.7.0"
  #.....
end

【讨论】:

    【解决方案6】:

    根据Zach Lipton 发布的link 上的评论,我有一个不需要降级net-ssh 的解决方法。将此代码放入config/deploy.rb:

    set :ssh_options, {
      config: false
      #Other options...
    }
    

    在我这样做之后,我得到了另一个错误,Error reading response length from authentication socket. 找到了here 的解决方案。在 Bash 提示符下执行这些命令:

    $ eval $(ssh-agent)
    $ ssh-add
    

    【讨论】:

    • 刚刚运行ssh-add 并再次尝试对我有用。谢谢
    【解决方案7】:
    set :ssh_options, {
     verbose: :debug
    }
    

    ...帮助很大!

    我遇到了一个问题,我使用 puttygen 生成了我的公钥和私钥,并将私钥导出为名称为 <somename>.id_rsa 的 OpenSSH。然后保存的公钥名称为<somename>.id_rsa.pub

    ( ! ) puttygen 保存的公钥是 RFC 4716 格式而不是 PEM。使用public 后缀而不是pub 作为公钥文件-

    【讨论】:

      【解决方案8】:

      如果上述所有解决方案都不起作用,请重新启动系统,因为您可能会因为 net-ssh 主机连接而遇到问题。当您重新启动并输入部署命令时,它会要求将身份添加到已知主机。

      【讨论】:

        【解决方案9】:

        首先尝试使用以下命令使用证书(file.pem)连接到您的服务器:

        ssh -i "file.pem" user@yourServerIp
        

        然后尝试运行 cap 生产部署。它为我解决了错误。我认为是因为证书的时间限制已过期。

        【讨论】:

          最近更新 更多