GitLab Runner:在没有外壳的情况下切换用户后在服务器上执行代码

Posted

技术标签:

【中文标题】GitLab Runner:在没有外壳的情况下切换用户后在服务器上执行代码【英文标题】:GitLab Runner: Execute code on server after switching user without shell 【发布时间】:2020-07-29 11:42:10 【问题描述】:

我正在尝试为 GitLab 项目设置自动部署。一旦更改合并到开发分支中,运行程序将登录服务器,切换到不同的用户,进入 web 目录,然后执行 git pull 以及其他一些任务。

如果您不熟悉 GitLab 运行器,它本质上只是一个临时服务器(docker 映像),可以执行您需要的任何操作。我只是用它来 ssh 到客户端服务器来执行我迄今为止为每次部署手动执行的命令,或者至少这是计划。

客户端服务器操作系统是 Ubuntu,我只能以 user 身份登录,为此我有一个 sudo pw,并且 specific-user 拥有该网站。

到目前为止,我已经能够通过 ssh 连接到所述服务器并进行设置,以便 user 可以切换到 specific-user 而无需手动输入 sudo密码。但这就是它结束的地方 - 我无法以 specific-user 身份实际执行任何命令。

这是我目前的代码 (.gitlab-ci.yml) 经过大量的反复试验和更多的谷歌搜索:

deploy_development:
  type: deploy
  environment:
    name: development
    url: https://website.com
  script:
    - ssh -tt user@server
      "sudo su - specific-user -s /bin/bash &&
      whoami &&
      cd htdocs &&
      git pull origin development"
  only:
    - development

GitLab 运行器输出如下:

$ ssh -tt user@server "sudo su - special-user -s /bin/bash && whoami && cd htdocs && git pull origin development"
Warning: Permanently added 'server, ip' (ECDSA) to the list of known hosts.
special-user@server:~$ 
...

三个点被动画化,大概表明终端正在等待输入。

注意:如果我使用“ssh”或“ssh -t”而不是“ssh -tt”,即使在使用 sudo su 之后我仍然是用户,因此无法执行任何代码为 特殊用户。

我必须做什么才能以其他用户的身份实际执行我的代码?

【问题讨论】:

【参考方案1】:

与往常一样 - 一旦你将它发布到堆栈溢出,你就会找到答案..

我就是这样解决的:

script:
    - ssh -tt user@server
      "sudo -u special-user -H sh -c
      'cd ~/htdocs &&
      git pull origin development'"

【讨论】:

以上是关于GitLab Runner:在没有外壳的情况下切换用户后在服务器上执行代码的主要内容,如果未能解决你的问题,请参考以下文章

更改 Gitlab CI Runner 用户

gitlab-runner运行一直卡住

docker环境下使用gitlab,gitlab-runner 为 NetCore 持续集成

Gitlab:如何使用/切换可用性很高的组跑步者

为啥gitlab-runner执行完script停不下来?

RoR cap 部署与 gitlab-runner 卡住并且没有触发通过响应