Я пишу небольшую утилиту. Я хотел бы попытаться sudo
запустить что-нибудь, если потребуется.
То есть: если права доступа к файлу не позволяют текущему пользователю работать с конкретным файлом (а sudo
правила позволят это сделать), я бы хотел, чтобы моя утилита sudo
запускала что-то как владелец файла.
Я надеюсь проверить эту возможность заранее, потому что предпочел бы, чтобы системные журналы не заполнялись шумом от неудачных sudo
попыток. Как sudo
сам сообщает о неудаче: «Об этом инциденте будет сообщено».
Итак, я надеюсь программно проверить: можно user <x>
запустить command <y>
через sudo
?
Вот проблема: хотя оно и /etc/sudoers
содержит это отображение, оно принадлежит пользователю root и не доступно для чтения обычным пользователям.
Я думал о порождении подпроцесса для запуска sudo -l
(который выводит команды, которые текущий пользователь может запустить sudo). Я бы тогда проанализировал вывод этого. Тем не менее, это кажется немного хрупким. Вывод содержит информацию, которую я хочу, но похоже, что она предназначена для чтения человеком (не для программного потребления). Я не знаю, есть ли какая-либо гарантия, что выход будет следовать тому же формату в будущем, или на разных платформах.
sudo -l
Считается ли программный анализ вывода безопасным? Если нет, есть ли лучшие варианты, чтобы заранее определить, будет ли команда sudo успешной?
(справочная информация по X / Y: эта утилита предназначена для использования учетной записью роли с ограниченным доступом. Я ожидаю, что некоторые другие пользователи будут использовать эту учетную запись, чтобы разрешить учетной записи с ограниченным доступом работать с файлами по правилам sudo. Однако я выиграл заранее не знаю, у кого из этих пользователей есть соответствующее правило sudo)
Ответы:
Согласно странице руководства sudo:
так что это будет сводиться к
Как указывает Муру, используйте либо
-U $USER
или,-U $USERTOTEST
либо ничего, в зависимости от ваших потребностей.источник
$USER
иметь в виду текущего пользователя, вы можете просто обойтисьsudo -l <command>
без-U $USER
.(targetUser) ALL, !/usr/bin/foo
.. в этом случаеsudo -l -u targetUser /usr/bin/foo
все еще кажется, что вывод/usr/bin/foo
и выход со статусом 0. Тем не менее, это в основном достаточно для моей простой проверки, и лучше, чем разбирать более подробныйsudo -l
вывод.