У меня есть длинный и продолжительный скрипт bash, где несколько команд нужно запускать от имени пользователя root, в то время как большинство команд нужно запускать от имени обычного пользователя до sudo, потому что это может испортить владение файлами и тому подобное.
Я придумал несколько методов, но у каждого из них есть свои проблемы
Способ 1: использование sudo внутри файла
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Это выглядело бы хорошо, с точки зрения написания кода. sudo
записывается перед несколькими операторами, которые на самом деле должны запускаться пользователем root, но если время между каждым sudo
вызовом слишком велико, sudo
снова запрашивается пароль. Кроме того, если первое выполнение sudo
завершается неудачно, например, из-за неверного пароля, остальная часть сценария все еще выполняется.
Способ 2: используя sudo для вызова файла, а затем при необходимости переключитесь обратно на первоначального пользователя
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Это также отстой, потому что мне нужно добавить su username -c
перед почти каждой строкой. Также возможно найти оригинальное имя пользователя после sudo
, но громоздко.
Есть ли способ лучше?
Изменить: я только разместил здесь небольшие бессмысленные сценарии, чтобы показать, о чем я говорю. В реальном скрипте у меня есть несколько строк, которым нужен sudo (запуск и остановка служб), некоторые строки, где не имеет значения, есть ли sudo, и довольно много строк, которые действительно нужно запускать без sudo.
sudo
если ему нужны повышенные разрешения. Но нет смысла переключатьсяsu username -c
на запускecho
. Другими словами, это звучит как [XY]. Не могли бы вы отредактировать и объяснить, что на самом деле будет делать ваш скрипт и почему вы чувствуете, что вам нужно так часто переключать пользователей?man sudo
?-v, --validate
Обновите кэшированные учетные данные пользователя, аутентифицируя пользователя при необходимости. Для плагина sudoers это продлевает время ожидания sudo еще на 15 минут по умолчанию, но не запускает команду. Не все политики безопасности поддерживают кэшированные учетные данные. ' (Если вы запускаете его достаточно часто, аутентификация sudo не должнаОтветы:
Что касается метода 2, проще использовать функцию. Например:
$SUDO_USER
это имя пользователя sudoer. Вы также можете использовать$(logname)
на своем месте.Бег на моей машине:
источник
Читая
man sudoers
, вы видите:Таким образом, вы можете разрешить
regular
на хостеmachine1
выполнятьcommand1
иcommand2
как корень, без пароля аутентификации с:но прочитайте каждую из них
man -k sudo
для деталей.источник
Может быть, это может помочь:
chmod 775 yourscript.sh
Затем вы можете использовать sudo внутри скрипта (без запроса пароля) и не можете использовать sudo для других команд внутри скрипта.
источник
chmod 775
только позволяет выполнить файл и не меняет пользователя, который выполняет файл или их права.