2

我编写了一个工作流来在 Linux 自托管 GitHub 运行器 VM 上安装一些工具依赖项。我正在使用自制软件来安装工具。使用 homebrew 要求它不能在 GitHub Runner 登录的 root 用户上运行。我想知道为什么当我创建一个将用户从 root 切换到我的测试用户的步骤时,事情会中断,但是当我在每个步骤中对那个用户执行 sudo 时一切正常,我想我解释得不好,所以见下文:

失败的工作流程(可以看到第一步将用户切换到 testUser):

 installHomebrew:
    name: Install Homebrew
    runs-on: [self-hosted]
        
    steps:
      - name: Switch to etpAdmin user
        run: sudo -u testUser -i

      - name: Install Homebrew silently
        run: sudo apt install linuxbrew-wrapper -y
        
      - name: Run brew for the first time to create the .linuxbrew directory
        run: brew -h

这将在最后一步失败,声称不应在 root 上运行自制软件,而以下工作流程可以正常工作。

 installHomebrew:
    name: Install Homebrew
    runs-on: [self-hosted]
        
    steps:
      - name: Install Homebrew silently
        run: sudo apt install linuxbrew-wrapper -y
        
      - name: Run brew for the first time to create the .linuxbrew directory
        run: sudo -u testUser -i brew -h

我的 Linux 有点生锈,但我的印象是使用sudo -u (username) -i会将终端登录到指定的用户,直到再次注销/切换用户,我错了还是有更好的方法来完成这个?

4

1 回答 1

2

免责声明;我不熟悉您正在运行的平台或您正在使用的工具,但我确实有一个有根据的猜测......我希望这也是-i标志的行为方式。

由于大多数供应商都在工作,它们通常(大部分)独立于其他步骤运行每个步骤。这(再次,通常)意味着环境不会从一个步骤转移到下一个步骤。所以在这种情况下,sudo -i单步运行不会对后续步骤产生任何影响。您可以试试这个,看看您的情况下的配置程序是如何运行的:

testUserChange:
    name: Test active user
    runs-on: [self-hosted]
        
    steps:
      - name: Default user
        run: whoami
        
      - name: Sudo user
        run: sudo -u testUser -i whoami

      - name: Should be default user again
        run: whoami

      - name: Maybe interactive shell like in first attempt
        run: sudo -u testUser -i

      - name: Who am I now
        run: whoami

现在至于-i,手册指出:

这意味着 shell 将读取特定于登录名的资源文件,例如 .profile 或 .login。如果指定了命令,则通过 shell 的 -c 选项将其传递给 shell 以执行。如果未指定命令,则执行交互式 shell。

虽然这可能有点令人困惑,因为大多数供应商不希望用户在运行时进行交互式输入,他们通常会关闭 STDIN 句柄(进程的输入)。如果我们有两个用户,user0ne并且usertw0,我希望我能演示一下这个行为;

$ export PS1="This is user0ne env \$ " # just to show when environment variables are re-set due to loading the login scripts
This is user0ne env $
This is user0ne env $ whoami
user0ne
This is user0ne env $ sudo -u usertw0 /bin/sh
This is user0ne env $ whoami
usertw0
This is user0ne env $ exit
This is user0ne env $ whoami
user0ne
This is user0ne env $

在上面的示例中,您可以看到虽然有效用户是 tw0,但环境仍然设置为 0ne 设置的设置。让我们尝试-i

This is user0ne env $ sudo -u usertw0 -i /bin/sh
$ whoami
usertw0
$ exit
This is user0ne env $

所以现在,看起来-i将环境(和登录)设置为 tw0。现在,虽然文档确实声明没有任何参数,但打开了交互式 shell:

This is user0ne env $ sudo -u usertw0 -i
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

usertw0@ubuntu:~$ logout
This is user0ne env $

让我们看看如果我们关闭输入处理程序(或者更准确地说,不输入任何内容)会发生什么:

This is user0ne env $ sudo -u usertw0 -i < /dev/null
This is user0ne env $ whoami
user0ne
This is user0ne env $

即使您提供/bin/sh运行命令,也会发生同样的情况,如上面的片段所示:

This is user0ne env $ sudo -u usertw0 -i /bin/sh < /dev/null
This is user0ne env $ whoami
user0ne
This is user0ne env $

因此,即使文档确实声明它将打开一个交互式 shell,一旦没有要读取的输入,shell 就会关闭,并且状态会返回给前一个用户。

干杯! :)

于 2021-03-16T03:50:40.263 回答