【问题标题】:GitLab CI: SSH fail, unable to authenticate private keyGitLab CI:SSH 失败,无法验证私钥
【发布时间】:2020-08-18 20:11:44
【问题描述】:

我按照link 尝试通过 SSH 连接到我在 Gitlab-CI 中的服务器。对于 SSH 密钥,我进入服务器,并生成公钥和私钥。私钥被提取到 GitLab CI/CD 环境变量中。

YAML 模板如下,大部分是从链接中复制过来的。

    image: docker:19.03.8
      services:
        - docker:19.03.8-dind

    deployment:
      variables:
        ip: <ip-address>
      script:
        - apk add --update openssh-client sshpass
        - eval $(ssh-agent -s)
        - echo "$SSH_PRIVATE_KEY" | ssh-add - > /dev/null
        - mkdir -p ~/.ssh
        - chmod 700 ~/.ssh
        - export SSHPASS=$AWS_PASSWORD
        - sshpass -e ssh -o StrictHostKeyChecking=no -vvv ubuntu@$ip echo testing

但是,我在尝试访问私钥时遇到了错误。

    debug1: Authentications that can continue: publickey,password
    debug1: Trying private key: /root/.ssh/id_rsa
    debug3: no such identity: /root/.ssh/id_rsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_dsa
    debug3: no such identity: /root/.ssh/id_dsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_ecdsa
    debug3: no such identity: /root/.ssh/id_ecdsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_ed25519
    debug3: no such identity: /root/.ssh/id_ed25519: No such file or directory
    debug1: Trying private key: /root/.ssh/id_xmss
    debug3: no such identity: /root/.ssh/id_xmss: No such file or directory
    debug2: we did not send a packet, disable method
    debug3: authmethod_lookup password
    debug3: remaining preferred: ,password
    debug3: authmethod_is_enabled password
    debug1: Next authentication method: password
    debug3: send packet: type 50
    debug2: we sent a password packet, wait for reply
    debug3: receive packet: type 51
    debug1: Authentications that can continue: publickey,password
    Permission denied, please try again.

如果有帮助,我正在使用 gitlab 共享跑步者。

[更新]

忘记在我要连接的服务器中添加,我将生成的公钥 id_rsa.pub 添加到 authorized_keys 文件中。

[编辑 1]

按照建议,我使用 ssh-keyscan 添加了已知主机,以将输出复制为变量 $SSH_KNOWN_HOSTS。在更新的 yaml 文件下方。但是我遇到了同样的错误。

    deployment:
      variables:
        ip: <ip-address>
      script:
        - apk add --update openssh-client sshpass
        - eval $(ssh-agent -s)
        - echo "$SSH_PRIVATE_KEY" | ssh-add - > /dev/null
        - mkdir -p ~/.ssh
        - chmod 700 ~/.ssh
        - touch ~/.ssh/known_hosts
        - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
        - chmod 644 ~/.ssh/known_hosts
        - export SSHPASS=$AWS_PASSWORD
        - sshpass -e ssh -o StrictHostKeyChecking=no -vvv ubuntu@$ip echo testing

【问题讨论】:

  • @DV82XL 尝试了您之前关于 SSH_KNOWN_HOST 的建议(编辑)。您添加的另外两个链接我也尝试过 b4。现在想一想如果我使用公私钥方法,我应该不需要使用sshpass登录,不知道为什么它不起作用。
  • 你的最终目标是什么?您是否尝试通过 SSH 连接到远程服务器以运行 Linux 命令或 bash 脚本?防火墙或代理呢?您在公司网络上吗?
  • 目标是在服务器中运行一个 bash 脚本来部署我的容器。不,我不在公司网络上。应该不会有任何阻碍,因为我可以在本地机器上正常使用 ssh/sshpass

标签: ssh gitlab-ci sshpass


【解决方案1】:

我不确定sshpass,因为我通常使用公钥/私钥。这是我设置为在远程服务器上运行 SCP/SSH 命令的作业示例:

deploy:
  stage: deploy
variables:
  hostname: app-dev
before_script:
  # optional step if you decide to use a hostname instead of IP address
  - cp -f ./network/etc/hosts /etc/hosts
  # Setup SSH
  - which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )
  - eval $(ssh-agent -s)
  - ssh-add <(cat $SSH_PRIVATE_KEY)
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan $HOSTNAME >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
script:
  # Copy files and execute commands
  - scp ./scripts/install_package.sh root@$HOSTNAME:/tmp/deploy
  - ssh root@$HOSTNAME "/tmp/deploy/install_package.sh && exit"

运行管道之前,您需要执行以下操作:

  1. 使用ssh-keygen 生成 ssh 密钥对。不要使用密码。公钥以.pub结尾,私钥没有扩展名。
  2. SSH 到远程服务器,将 public 密钥的内容复制到~/.ssh/authorized_keys
  3. 将您的私钥内容复制到名为 SSH_PRIVATE_KEY 的 GitLab File Environment Variables
  4. 如果您使用 $HOSTNAME 环境变量,请在管道中定义该变量并将 IP/主机名添加到管道容器中的 /etc/hosts 文件中。否则,只需使用 IP 地址。

【讨论】:

  • 感谢您的帮助~ ssh-keygen,我在哪里生成它?本地机器?还是我想连接的远程服务器?我以前做过后者
  • @Jake ssh-keygen 是一个 CLI 工具,是 OpenSSH 的一部分,comes with windows 在 Linux 上可用。重要的是 2 个输出键(文本文件),所以不管你在哪里运行它。我通常在 Windows 上运行它。
  • 哦,好吧,我认为这很重要,因为公钥最后包含主机名
  • 我认为我似乎错过了以某种方式在服务器中添加授权密钥......显然我把它放在了错误的服务器中~ :x 但至少现在对 Ssh 的工作方式有了更清晰的了解在你的帮助下在 Gitlab 中
  • 确保在 GitLab UI 中类型文件的变量末尾添加换行符
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2020-07-03
  • 2015-01-16
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多