在 gitlab 管道中运行“sudo su”

Posted

技术标签:

【中文标题】在 gitlab 管道中运行“sudo su”【英文标题】:Running "sudo su" within a gitlab pipeline 【发布时间】:2022-01-20 00:40:09 【问题描述】:

我已经在我的 gitlab 运行器 SSH 的服务器上安装了一些软件,并且需要在执行 sudo su 之后运行其中一个命令。如果我以普通用户身份运行它,但前面有sudo - 它不起作用。我得先完全切换到sudo用户。

当我通过 SSH 连接到服务器并手动执行命令时,这可以正常工作。但是当我从管道中尝试时(下面的粗略代码):

my_script:
  stage: stage
  script:
    - ssh -o -i id_rsa -tt user@1.1.1.1 << EOF
    - sudo su
    - run_special_command <blah blah>
    - exit
    # above exits from the SSH. below should stop the pipeline
    - exit 0
    - EOF

我得到如下非常奇怪的输出:

$ sudo su
[user@1.1.1.1 user]$ sudo su
echo $'\x1b[32;1m$ run_special_command <blah blah>\x1b[0;m'
run_special_command <blah blah>
echo $'\x1b[32;1m$ exit\x1b[0;m'
exit
echo $'\x1b[32;1m$ exit 0\x1b[0;m'
exit 0
echo $'\x1b[32;1m$ EOF\x1b[0;m'

而我看到的是它甚至根本不运行命令——我不知道为什么。

【问题讨论】:

在您的日常 shell 中,如果您将一系列命令链接在一起并在其中包含用户更改,我不希望命令的其余部分继续运行。我有一个预感 gitlab runner 遇到了同样的问题。您能否将特殊命令制作成将 setuid 位设置为 root 的标准脚本? 尝试在您的作业 YAML 中使您的脚本成为多行字符串。 sudo -E &lt;command&gt; 也可以在这里代替sudo su 【参考方案1】:

在这种情况下,您需要将脚本作为多行字符串放入 YAML。或者,提交一个 shell 脚本来 repo 并执行它。

并且需要在执行 sudo su 之后运行其中一个命令。如果我以普通用户的身份运行它,但前面有 sudo - 它不起作用。

附带说明一下,您可以在命令前使用sudo -E 而不是sudo su。但是你也应该使用多行脚本。

MyJob:
  script: |
    ssh -o -i id_rsa -tt user@host << EOF
    sudo -E my_command
    EOF
    exit 0

或者,将您的脚本写入提交到存储库的 shell 脚本(设置可执行权限)并从您的作业中运行它:

MyJob:
  script: “my_script.sh”

【讨论】:

以上是关于在 gitlab 管道中运行“sudo su”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gitlab 中基于管道变量运行作业?

为合并请求触发的管道运行应用 GitLab CI/CD 管道更改

在 Gitlab 管道中的条件手动阶段之后运行阶段

GitLab 仅手动而不是自动运行管道

GitLab Runner - 如何一次只允许一个管道运行

如果前一个管道中正在运行相同的作业,如何等待 GitLab 作业?