gpt4 book ai didi

ruby - Capistrano错误: could not connect to ssh-agent

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:07 24 4
gpt4 key购买 nike

我在Capistrano部署中使用了基岩。
当我使用bundle exec cap staging deploy:check命令时,出现身份验证错误:

...
D, [2015-05-09T15:39:53.878464 #15636] DEBUG -- net.ssh.authentication.session[1e34a58]: trying publickey
D, [2015-05-09T15:39:53.878464 #15636] DEBUG -- net.ssh.authentication.agent[1e30d2c]: connecting to ssh-agent
E, [2015-05-09T15:39:53.879447 #15636] ERROR -- net.ssh.authentication.agent[1e30d2c]: could not connect to ssh-agent
E, [2015-05-09T15:39:53.879447 #15636] ERROR -- net.ssh.authentication.session[1e34a58]: all authorization methods failed (tried publickey)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as deploy@SERVER_IP: Authentication failed for user deploy@SERVER_IP
Tasks: TOP => git:check => git:wrapper

Capistrano无法连接到我服务器上的ssh-agent。

但是我可以像这样 ssh deploy@SERVER_IP一样通过SSH登录SSH,而无需输入密码。我把 Capistrano Authentication & Authorisation Docs page中的所有指令都删除了,所以我可以使用 me@localhost $ ssh deploy@one-of-my-servers.com 'hostname; uptime'这样的命令。
如果我输入命令 ssh -A deploy@SERVER_IP 'env | grep SSH_AUTH_SOCK'我得到结果
SSH_AUTH_SOCK=/tmp/ssh-UweQkw7578/agent.7578

这是我的deploy.rb文件:
set :application, 'dyxovka-special'
set :repo_url, 'git@github.com:tanzoor/dyxovka-wp-theme.git'
set :branch, :master
set :tmp_dir, '~/tmp'
set :log_level, :info
set :linked_files, fetch(:linked_files, []).push('.env')
set :linked_dirs, fetch(:linked_dirs, []).push('web/app/uploads')

这是我的staging.rb文件:
set :stage, :staging
set :deploy_to, -> { "/var/www/vhosts/project/dev" }
server 'SERVER_IP', user: 'deploy', roles: %w{web app}
set :ssh_options, {
user: 'deploy',
keys: %w('/c/Users/alexander/.ssh/id_rsa'),
forward_agent: true,
auth_methods: %w(publickey),
verbose: :debug
}
fetch(:default_env).merge!(wp_env: :staging)

在sshd_config文件中启用了Apache的代理转发代理指令: AllowAgentForwarding yes
如何使用我的配置文件使我的部署工作?

Windows 8.1
Ruby 2.2.0
Capistrano 3.2.1
git ·巴什(Git Bash)

最佳答案

好的,所以我遇到了同样的问题,花了太长时间来弄清楚这里到底发生了什么,结果是-

  • 对于Windows上的 ruby ,必须运行pagent而不是ssh-agent才能使Capistrano和代理转发正常工作-实际上,几乎所有在Windows上使用Ruby net-ssh库的工具都可以使用。

  • 而且我认为这不会改变,至少暂时不会改变。

    代理转发

    有关代理转发以及主要挑战如何最终备份到我们的工作站上的更多信息,请参见 An Illustrated Guide to SSH Agent Forwarding

    术语
  • 工作站-机器(Windowa服务器/台式机/笔记本电脑)我们的SSH
    客户端软件正在运行,最重要的是,我们的PKI正在运行
    私钥存储在(带有或不带有密码短语)
  • 部署节点-我们的Capistrano部署任务的目标,大多数
    就像在config/deploy.rb中的“服务器”键中定义的一样,或者
    config/deploy/.rb文件
  • git repo-我们将从中提取代码的地方,首先通过“git”查询
    ls-remote”-我们将通过SSH访问此git repo,并进行部署
    节点将使用代理转发将 key 质询传递回
    工作站
  • SSH客户端软件-我们如何与远程服务器上的sshd联系,以及
    可以访问我们的私钥。可能是腻子,OpenSSH SSH
    客户端或Ruby中的net-ssh库。

  • 设置

    我有一个带有Git-Bash的Windows 7工作站,及其OpenSSH ssh客户端,以及来自 Joe Reagle的脚本,该脚本设置了一些环境变量,这些变量指示ssh-agent在哪个端口和pid上进行操作。

    我也有Putty和Pageant,但是起初我只专注于OpenSSH/Git-Bash工具。

    我已经从工作站到部署节点设置了无密码的ssh,正在运行ssh-agent,通过ssh-add添加了我的 key ,并且已将我的公共(public) key 注册为git repo的只读访问 key 。 。

    基础知识

    因此,我们正在尝试使用SSH代理转发,以使Capistrano从我们的Git存储库中 pull 到我们的部署节点上。

    现在,我们可以通过在部署节点上设置我们的公共(public)SSH key 并使用OpenSSH ssh客户端来确认我们有无密码的ssh来进行测试。然后我们可以通过以下方式设置ssh-agent
  • 启动ssh-agent并根据需要设置SSH_AUTH_SOCK和SSH_AGENT_PID。
  • 通过ssh-add
  • 将我们的私钥添加到ssh-agent
  • 将我们的公钥作为授权 key 添加到git repo
  • ssh到部署节点,然后从那里执行“git ls-remote git @”(或ssh -T git @)

  • 如果一切设置正确,那么一切都会正常进行,因此我们会认为“好吧,我可以进行'cap deploy:check'“-它将失败。

    错误的地方

    我们会得到一个错误

    “从身份验证套接字读取响应长度时出错”

    谁在告诉我们这个?现在还不清楚,但是
  • 不是git repo
  • 它不是部署节点上的git客户端
  • 它不是部署节点上的sshd守护程序,它想将关键挑战传递回工作站。

  • 它是工作站上的Ruby ssh客户端库。

    我们怎么知道这个

    在deploy.rb文件的ssh_options哈希中,添加以下内容:
    详细::debug

    当我们这样做时,我们会看到此消息
  • 选美没有开始。

  • 为什么Capistrano尝试使用Pageant而不是ssh-agent

    通过Capistrano运行时,ssh客户端与您手动验证事物时所使用的客户端不同。

    手动验证时,它是一个OpenSSH ssh客户端。现在它是Ruby中的net-ssh库。

    在Windows上,net-ssh具有以下几行
    if Net::SSH::Authentication::PLATFORM == :win32
    require 'net/ssh/authentication/pageant'
    end

    或者
    case Net::SSH::Authentication::PLATFORM
    when :java_win32
    require 'net/ssh/authentication/agent/java_pageant'
    else
    require 'net/ssh/authentication/agent/socket'

    因此,加载选美会被硬编码到net-ssh中。它甚至不尝试查看您是否在类unix的 shell (如git-bash或cygwin)下运行,然后使用unix域ssh-agent SSH_AUTH_SOCK

    目前,net-ssh不会尝试打开一个名为socket的unix域。从理论上讲,我认为可以通过stdlib中的UNIXSocket类实现。但是我还没有在Windows机器上进行过尝试。

    关于ruby - Capistrano错误: could not connect to ssh-agent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30140440/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com