У меня есть скрипт , который выполняет три функции: A && B && C
.
Функцию B
нужно запускать как суперпользователь, A
а C
пока нет.
У меня есть несколько решений, но ни одно из них не удовлетворяет:
sudo весь скрипт:
sudo 'A && B && C'
Это кажется плохой идеей для запуска
A
иC
как супер-пользователь, если он не нуженсделать скрипт интерактивным:
A && sudo B && C
Возможно, мне придется ввести свой пароль, но я хочу, чтобы мой сценарий был неинтерактивным, поскольку каждая функция может занять некоторое время, и я не хочу, чтобы сценарий ждал меня. Ну, это также, почему это сценарий, так что мне не нужно смотреть его запуск.
Глупое решение:
sudo : && A && sudo -n B && C
Сначала кажется глупым запускать неоперативный код
sudo
, а также я должен скрестить палец, что А не собирается брать больше, чем$sudo_timeout
.Гипотетическое решение (я хочу, чтобы вы сказали, что оно существует):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
Это будет запрашивать мой пароль в начале, а затем использовать эти учетные данные только при необходимости.
Что ты думаешь обо всем этом? Я был бы очень удивлен, что нет решения этой проблемы, так как я думаю, что это довольно распространенная проблема (как насчет make all && sudo make install
)
источник
A
иC
части явного использованияsu -l some_non_priviliged_user
. Нет проблем с тайм-аутом и нет привилегий для A и C. Я не думаю, что 4 возможно,sudo
кажется "глобальным состоянием" для пользователя.Ответы:
Я думаю, что лучшее, что вы можете сделать, это запустить скрипт,
sudo
а затем запустить процессы, которые вы хотите запустить как обычный пользователь, явно с помощьюsu user
илиsudo -u user
:источник
Добавьте ваш скрипт в
/etc/sudoers
файл сNOPASSWD
атрибутом, чтобы он мог запускаться без запроса пароля. Вы можете привязать это к определенному пользователю (или группе пользователей) или разрешить запускатьsudo
его любому пользователю вашей системы.Пример строки для скрипта с именем
/usr/local/bin/bossy
может выглядеть примерно такИ тогда вы бы использовали что-то вроде этого
Для этого примера я предположил
PATH
включает/usr/local/bin
. Если нет, то просто используйте полный путь к скрипту, т.е.sudo /usr/local/bin/bossy
источник
Вы можете использовать как
!requiretty
опцию,sudo
так иNOPASSWD
опцию. Но имейте в виду, что это снижает безопасность.источник
/etc/sudoers
входом для пользователя , чтобы выполнить командуB
сNOPASSWD
правильным ответ.Опираясь на мой ответ Предварительную авторизацию sudo? (Чтобы потом можно было запустить) , напишите два скрипта:
ABC_script
:B_script
:Выполнить
./ABC_script
:sudo -b ./B_script
. Это запрашивает пароль ( сразу после запускаABC_script
). Предполагая , что введен правильный пароль, он нереститсяB_script
в б ackground (потому что-b
было указано) , как корень. Кажется, это эквивалентноsudo sh -c "./B_script &"
.B_script
начинает работать асинхронно, параллельно сABC_script
.B_script
проверяет наличие файла с именемA_is_done
and loop до его появления.ABC_script
работаетA
. Если / когдаA
заканчивается успешно, скрипт создает файл с именемA_is_done
.ABC_script
затем проверяет наличие файла с именемB_is_done
and loop, пока он не появится.B_script
обнаруживает существованиеA_is_done
и прерывает цикл. УдаляетA_is_done
файл и запускаетсяB
. Помните,B_script
он работает от имени пользователя root, поэтому он работаетB
от имени пользователя root. Если / когдаB
заканчивается успешно, скрипт создает файл с именемB_is_done
и завершает работу.ABC_script
обнаруживает существованиеB_is_done
и прерывает цикл. УдаляетB_is_done
файл. Помните, что онB_script
запускается с правами root, поэтомуB_is_done
он принадлежит root, и вы хотите использовать его,rm -f
чтобы избежать получения запроса на подтверждение.ABC_script
затем бежитC
и выходит.Примечания для дальнейшей доработки:
ABC_script
должен, вероятно, работатьB_script
по абсолютному пути, а не./
.A_is_done
иB_is_done
,ABC_script
вероятно , должны генерироваться случайные, уникальные имена файлов.Должно быть предусмотрено, что скрипт, ожидающий прокрутки, будет уведомлен, если ожидающая его программа завершилась, но завершилась неудачно. (Прямо сейчас, если происходит
A
сбой, оба сценария просто переходят в бесконечный цикл ожидания.) Это может быть так же просто, как изменитьв
а затем изменяете время ожидания для чтения
X_is_done
файлов и продолжаете, если оно содержит 0, и выходите в противном случае.источник
Будь тупым. использовать много строк.
источник
&&
A && sudo B && C
. Так же, как Антуан объясняет в вопросе; он не запрашивает пароль доA
тех пор, пока не закончил, и он не хочет ждать этого, или сценарий ждет его.