Gitlab CI 中 SSH 连接被拒绝。

3

我正在使用Gitlab CI来构建静态生成的网站并将其发送到我的服务器。 我使用SSH密钥对从rsync建立连接,但是我的服务器拒绝连接。

我尝试了几件事情:从ED25519密钥开始,改用RSA密钥,所有公共密钥都在服务器上的authorized_keys中,通过gitlab-ci.yml更改了文件和文件夹的权限,使用ssh-keyscan将服务器放入已知主机…无济于事。

gitlab-ci.yml如下:

image: ruby:2

pages:
  stage: deploy
  before_script:
  - apt-get update
  - apt-get install rsync -y
  - eval $(ssh-agent -s)
  - chmod 400 "$SSH_PRIVATE_KEY"
  - ssh-add "$SSH_PRIVATE_KEY"
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan $SERVER >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
  script:
  - bundle install
  - bundle exec jekyll build -d $LOCALDIR
  after_script:
  - rsync -paz $LOCALDIR $USER@$SERVER:$REMOTEDIR
  artifacts:
    paths:
    - $LOCALDIR
  only:
  - master
  - dev

日志输出的一部分如下:

$ rsync -paz $LOCALDIR $USER@$SERVER:$REMOTEDIR
Permission denied, please try again.
Permission denied, please try again.
$SERVER: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(228) [sender=3.2.3]

嗯,这个话题有什么帮助或提示吗?

编辑1 - SSH日志

谢谢@Andrew。我使用建议的ssh -vvvvvv ...选项,并提取了输出的一部分:

debug1: Next authentication method: publickey
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_ecdsa_sk
debug3: no such identity: /root/.ssh/id_ecdsa_sk: 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_ed25519_sk
debug3: no such identity: /root/.ssh/id_ed25519_sk: 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

所以,也许在 gitlab-ci.yml 中的命令 ssh-add "$SSH_PRIVATE_KEY" 并没有按预期工作。

编辑2 - 答案

感谢 @VonC 提供的复制 SSH 私钥的提示,问题得到了解决。以下是最终的 gitlab-ci.yml,可以正常工作:

image: ruby:2

pages:
  stage: deploy
  before_script:
  - apt-get update
  - apt-get install rsync -y
  - eval $(ssh-agent -s)
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - cp "$SSH_PRIVATE_KEY" ~/.ssh/id_ed25519
  - chmod 600 ~/.ssh/id_ed25519
  - ssh-keyscan $SERVER >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
  script:
  - bundle install
  - bundle exec jekyll build -d $LOCALDIR
  after_script:
  - rsync -auz --delete --omit-dir-times $LOCALDIR $USER@$SERVER:$REMOTEDIR
  artifacts:
    paths:
    - $LOCALDIR
  only:
  - master
  - dev

你能否添加 ssh -vvvvvv $USER@$SERVER exit 0,假设你的使用账户没有被限制在rsync上,并显示相关日志?此外,你是否有访问该服务器以检查sshd日志的权限?journalctl -u sshd应该会有所帮助。 - Andrew
@user 我在我的回答中添加了一个解决方法。 - VonC
2个回答

1

首先,请确保使用没有密码的私钥,这意味着您不需要eval $(ssh-agent -s)
管道通常无法与在ssh连接期间设置的密码短语很好地交互。

其次,请仔细检查相应的公钥是否已正确添加到远程服务器的~$USER/.ssh/authorized_keys中。

使用ssh -Tvv $USER@$SERVER可以帮助管道端检查您的密钥是否实际使用。
并且您可以在远程服务器上启动sshd调试模式以检查您是否实际接收到SSH查询。


也许在 gitlab-ci.yml 中执行的命令 ssh-add "$SSH_PRIVATE_KEY" 没有按预期工作。 作为替代方案,将您的密钥复制为默认名称:
cp "$SSH_PRIVATE_KEY" ~/.ssh/id_ed25519

这样就可以被选择,而不需要使用 ssh-agent


1
谢谢@VonC,复制私钥的提示解决了问题。现在rsync正在按预期工作。我将在问题中添加我的最终gitlab-ci.yml。一切顺利! - user2540800

1
  • 只需要一步..

  • (下面的示例中也包含了rsa文件名,您也可以使用ed25519)

  • 由于您将在变量SSH_PRIVATE_KEY中拥有密钥,因此它“应该”像这样工作(但请阅读以下内容)

    after_script:
    - apt-get update && apt-get -y --no-install-recommends bash rsync openssh-client && ( echo "$SSH_PRIVATE_KEY" > /tmp/id_rsa && chmod 0600 /tmp/id_rsa )  &&  ssh-agent bash -c "test -e ~/.ssh || mkdir ~/.ssh; ssh-keyscan $SERVER >> ~/.ssh/known_hosts;ssh-add ~/tmp/id_rsa; rsync -paz $PWD $USER@$SERVER:$REMOTEDIR "
    

这可能会失败(多行字符串), 因此我建议对您的密钥进行base64编码(base64 -w0 ~/.ssh/id_rsa ;echo

  after_script:
  - apt-get update && apt-get -y --no-install-recommends bash rsync openssh-client && ( echo "$SSH_PRIVATE_KEY" |base64 -d > /tmp/id_rsa && chmod 0600 /tmp/id_rsa )  &&  ssh-agent bash -c "test -e ~/.ssh || mkdir ~/.ssh; ssh-keyscan $SERVER >> ~/.ssh/known_hosts;ssh-add ~/tmp/id_rsa; rsync -paz $PWD $USER@$SERVER:$REMOTEDIR "

(

实际上,当您将密钥放在〜/ .ssh / id_rsa 下时,您也可以省略ssh-agent但它需要具有0600权限。 您还可以尝试head -c 120 /tmp/id_rsa以查看内容是否以正确的值开头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接