Почему действие Github в автономном средстве запуска Linux требует подкачки пользователя для каждой команды, если вы не хотите запускать от root

Я написал рабочий процесс для установки некоторых зависимостей инструментов на автономную виртуальную машину GitHub runner в Linux. Я использую homebrew для установки инструмента. Использование homebrew требует, чтобы он не запускался от имени пользователя root, под которым регистрируется GitHub Runner. Мне интересно, почему, когда я создаю шаг, который переключает пользователя с 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

Это не сработает на последнем шаге, заявив, что homebrew не должен запускаться от 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 будет регистрировать терминал для указанного пользователя до тех пор, пока снова не выйдет из системы / не переключит пользователя, я ошибаюсь или есть лучший способ сделать это?

1 ответ

Заявление об отказе от ответственности; Я не знаком с платформой, на которой вы работаете, или с инструментом, который вы используете, но у меня есть обоснованное предположение ... и я надеюсь, что так же ведет себя флаг.

Поскольку большинство средств обеспечения работают, они обычно запускают каждый шаг (в основном) независимо от других шагов. Что (опять же, обычно) означает, что среда с одного шага не переносится на следующий. Итак, в этом случае в одном шаге не повлияет на последующие шаги. Вы можете попробовать это, чтобы увидеть, как работает провайдер в вашем случае:

      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

Что касается руководства, то в руководстве говорится:

Это означает, что файлы ресурсов для входа в систему, такие как .profile или .login, будут прочитаны оболочкой. Если команда указана, она передается в оболочку для выполнения с помощью параметра -c оболочки. Если команда не указана, выполняется интерактивная оболочка.

Хотя это может немного сбивать с толку, поскольку большинство провайдеров не ожидают интерактивного ввода данных пользователем во время выполнения, они обычно закрывают дескриптор STDIN (ввод для процесса). Если у нас два пользователя, и , Я надеюсь, что смогу продемонстрировать поведение;

      $ 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. Попробуем с:

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

Итак, теперь похоже устанавливает среду (и логин) на tw0. Теперь, хотя в документации указано, что интерактивная оболочка открывается без каких-либо аргументов:

      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 $

И то же самое произойдет, даже если вы предоставите в качестве команды для запуска, как показано во фрагменте выше:

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

Таким образом, даже несмотря на то, что в документации указано, что он откроет интерактивную оболочку, оболочка закрывается, когда нет ввода для чтения, и состояние возвращается к предыдущему пользователю.

Ваше здоровье! :)

Другие вопросы по тегам