Почему действие 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 $
Итак, теперь похоже
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 $
Таким образом, даже несмотря на то, что в документации указано, что он откроет интерактивную оболочку, оболочка закрывается, когда нет ввода для чтения, и состояние возвращается к предыдущему пользователю.
Ваше здоровье! :)