Запустить команду sudoed после завершения скрипта?

Я кодирую сценарий bash, который:

  • запускает некоторую команду sudoed при инициализации
  • освобождает корневые разрешения для целей безопасности ( sudo -K )
  • запускает непривилегированную программу
  • но требует корневых разрешений при завершении

Я ищу простой и безопасный способ избежать повторного запроса пароля пользователя при завершении скрипта .

Я думаю о вилке перед sudo -K ожидая сигнала термина. Я не знаю, является ли это самым элегантным / безопасным решением.

Вот код:

 sudo unshare -m \ sudo -u "$USER" -g `id -g -n "$USER"` \ bash -c \ "sudo mount --bind \"$MOUNT_DIR\" \"$MOUNT_DIR\"; \ sudo mount --make-private \"$MOUNT_DIR\"; \ sudo -K; \ <unprivilegied program here>; \ sudo umount \"$MOUNT_DIR\"" 

NB: для информации это создает частное монтирование в пространстве имен, к которому будет иметь доступ только программа. unshare -r не является вариантом для запуска программы.

  • sudo su error messege через LDAP
  • сохраняйте псевдонимы, когда я использую sudo bash
  • Kubuntu - контекстное меню GUI sudo / root
  • Можете ли вы указать iptables как пользователя без полномочий root и почему?
  • Как sudo помнит, что вы уже ввели пароль root?
  • Предотвратите доступ пользователя sudo к определенной папке и файлам
  • Parallels на Mac - больше не может работать в Ubuntu
  • linux + написать синтаксис в visudo
  • One Solution collect form web for “Запустить команду sudoed после завершения скрипта?”

    Я замечаю, что вы много переходите между обычным пользователем и root:

    • переключиться на root для запуска unshare
    • вернитесь к обычным пользователям, чтобы запустить bash (хотя кажется, что вы не используете никаких базизмов, чтобы вы могли также запустить sh который был бы более портативным и, возможно, более легким)
    • вернитесь к корню несколько раз внутри этой оболочки bash чтобы делать более привилегированные вещи

    Я думаю, вы можете упростить это и сократить количество раз, чтобы требовать отскока назад и вперед между пользователями и решить вашу проблему одновременно.

     sudo unshare -m sh -c ' mount --bind "$1" "$1"; mount --make-private "$1"; exec sudo -u "#$SUDO_UID" -g "#$SUDO_GID" sh -c " sudo -K; <unprivilegied program here> " ' - "$MOUNT_DIR" 

    Технически существует корневая оболочка, которая постоянно работает во время выполнения непривилегированной части, но единственное, что собирается сделать оболочка, – это ждать завершения непривилегированной части и ничего другого. Но если вы действительно хотите заранее отказаться от своих привилегий sudo и не попросить пользователя предоставить их снова, все альтернативы также будут включать в себя затяжной процесс, ожидающий, что сигнал будет запускать команду umount каким-то образом ,

    В стороне, хорошо, что ваша команда полностью автономна и все, и я сохранил этот дух в своем предложении, но, честно говоря, большие блоки кода, предоставленные в качестве опции командной строки для sh -c , трудно писать, читать и поддерживать из-за всех проблем, связанных с кавычками, о которых вы должны беспокоиться, и я бы рекомендовал разложить их на свой собственный сценарий и выполнить все это как:

     sudo unshare -m /usr/local/bin/script-that-does-the-rest-of-the-work 

    Кроме того, это упростит для написания ваших правил sudo для разрешенных команд, которые трудно написать, используя мое предложение, если вы не позволяете пользователю запускать какую-либо команду вообще, что равнозначно предоставлению им полного доступа к корне. В этом случае вам нужно будет разрешить команду unshare -m sh -c <huge block> "$MOUNT_DIR" которая является довольно сложной Cmnd_Alias для записи.

    Linux и Unix - лучшая ОС в мире.