
Я использую программу ( yay
, в archlinux), которая использует sudo
для повышения привилегий. Однако, если она не найдет sudo
, она переключится на su
, что я и хочу, так как мой пользователь не sudoer, но у меня установлен sudo
(потому что есть другая программа, которую нужно sudo
установить даже при запуске от имени root, я знаю, что это глупо).
Теперь вопрос в том, как мне запустить эту программу ( yay
), заставив ее думать, что sudo
она не существует?
Обратите внимание, что yay
это менеджер пакетов (помощник AUR), который также собирает и устанавливает пакеты из исходного кода, и вы не можете выполнять эти сборки как пользователь root по соображениям безопасности, что вполне справедливо.
Также обратите внимание, что я уже открыл вопросздесьв yay
репозитории, но пока это исправляется, я был бы признателен за альтернативное решение.
решение1
Единственный способ обхода, который я могу придумать без внесения изменений, yay
— это создать скрипт-оболочку, который вы будете запускать как root и который будет временно удаляться sudo
перед запуском yay
:
#!/bin/sh
su -c "mv /sbin/sudo /sbin/sudo.old" && yay "$@"
su -c "mv /sbin/sudo.old /sbin/sudo"
Это попросит вас ввести пароль root дважды. Другой вариант — просто запустить скрипт как root, а затем в скрипте использовать su
для переключения на другого пользователя:
#!/bin/sh
normalUser="$1"
shift
mv /sbin/sudo /sbin/sudo.old &&
su -c "yay $@" $normalUser
mv /sbin/sudo.old /sbin/sudo
Затем вы можете запустить это как:
su -c "/path/to/yay.wrapper.sh adrin $yayArguments"
В вашем случае это должно быть безопасно, поскольку вы фактически не используете sudo
, но я бы все равно сделал копию, /sbin/sudo
чтобы вы могли легко восстановить ее, если что-то пойдет не так, просто на всякий случай.
решение2
Самый простой способ обойти эту проблему — воспользоваться опцией --sudo=su
.
вкратце- бегите yay --sudo=su -Syu
, чтобы достичь желаемого эффекта.
Объяснение, почему yay --sudo=su
не произошло то, что вы ожидали, приведено ниже.
Проблема связана со способом yay
обработки аргументов CLI. Из документации:
If no arguments are provided 'yay -Syu' will be performed.
If no operation is selected -Y will be assumed.
Если аргументы не указаны, yay -Syu
выполняется (полное обновление системы), но --sudo=su
считается аргументом, поэтому yay выбирает операцию -Y
(перечисление пакетов, соответствующих запросу, который в данном случае пуст, и, таким образом, команда немедленно завершается).
Вот фрагмент кода, отвечающий за это:https://github.com/Jguer/yay/blob/next/pkg/settings/parser/parser.go#L618