我正在尝试在 gitlab 中设置一个部署管道到我的远程 Linux 服务器。 错误是:
$ ssh -p $SERVER_PORT -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "echo 1"
ssh: connect to host myhost port myport: Operation timed out
部署(.gitlab-ci.yml)脚本是:
deploy:
image: alpine:latest
stage: deploy
tags:
- deployment
before_script:
- 'command -v ssh-agent >/dev/null || ( apk add --update openssh )'
- eval $(ssh-agent -s)
- cat "${ID_RSA}" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- chmod 400 $ID_RSA
- apk update && apk add openssh-client
- ssh -p $SERVER_PORT -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "echo $SERVER_IP"
我在本地计算机上运行了相同的 ssh 命令(使用相同的 ID_RSA 密钥)并且它有效
我在本地计算机上运行了相同的 ssh 命令(使用相同的 ID_RSA 密钥)并且它有效
我经常看到在我的公司中,某些客户端可以访问服务器,但其他客户端则无法访问服务器:网络路由并不总是向所有人开放。
作为诊断步骤,您可以在管道中添加一个步骤,将 ping 结果打印到服务器以检查网络连接。例如:
script:
- apk add iputils
- ping -c 4 $SERVER_IP
- apk update && apk add openssh-client
- ssh -p $SERVER_PORT -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "echo $SERVER_IP"
您还可以使用命令
curl -v telnet://$SERVER_IP:22
,检查端口 22 是否可达并正在侦听。
如果是,则检查 SSH 密钥权限:您已在
$ID_RSA
的 script
部分中将 .gitlab-ci.yml
密钥的权限设置为 400。before_script
部分中使用密钥,因此您可能需要先设置权限,然后才能在 before_script
部分中使用它。
更新您的
.gitlab-ci.yml
:
before_script:
- 'command -v ssh-agent >/dev/null || ( apk add --update openssh )'
- eval $(ssh-agent -s)
- chmod 400 $ID_RSA
- cat "${ID_RSA}" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- apk update && apk add openssh-client
- ssh -p $SERVER_PORT -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "echo $SERVER_IP"