Запустить команду, заставив ее думать, что `sudo` не существует

Запустить команду, заставив ее думать, что `sudo` не существует

Я использую программу ( 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

Связанный контент