ssh 不用手动输密码远程执行命令

小组使用了 GitLab,在某项目中需要利用 CI 进行远程部署,但生产服务器是另一台远程服务器,而 CI Runner 的运行环境是 Docker。

由于 ssh 的安全措施,在建立 ssh 连接时不允许自动化输入密码,必须在出现密码框后手动输入,因此在 CI 流程中无法实现;经过了解,一款名为 sshpass 的工具可以满足此需求;

在本机测试时,使用

1
brew install sshpass

提示

1
We won't add sshpass because it makes it too easy for novice SSH users to ruin SSH's security.

可知此工具的确是破坏了 ssh 的安全性。

但在内部机器的 CI Runner Docker 中,不考虑这个问题。Gitlab CI Runner 默认使用的是 alpine:latest,需要事先安装依赖及 sshpass,因此在 before_script 中加上 apk add --update --no-cache openssh sshpass 安装此工具。

在后续的 job/stage 中,加入远程执行命令脚本:

1
sshpass -p 'password' ssh -T -o StrictHostKeyChecking=no username@192.168.xxx.xxx 'sh /home/remote/script.sh'

即可绕过手动输入密码步骤,在 CI 中运行远程 sh 脚本。

在联网环境慎用,防止泄密