Если я выполню sudo файл сценария Bash, все ли команды внутри сценария Bash также будут выполнены как sudo?

30

Я хочу написать автоматический скрипт после установки в Bash (называется post-install.sh, например). Скрипт автоматически добавляет и обновляет репозитории, устанавливает и обновляет пакеты, редактирует файлы конфигурации и т. Д.

Теперь, если я выполню этот скрипт, например, с помощью sudo post-install.sh, мне будет предложено ввести sudoпароль только один раз, или мне нужно будет вводить sudoпароль при каждом вызове команды внутри скрипта, что требует sudoразрешения? Другими словами, команды внутри скрипта bash «наследуют», так сказать, разрешения на выполнение?

И, если это действительно так , есть ли еще вероятность того, что sudoразрешения истечут (если, например, конкретная команда займет достаточно много времени, чтобы превысить время sudoожидания)? Или начальный sudoввод пароля будет длиться в течение всего времени действия сценария?

Достойный Дилетант
источник
4
Возможно, вам будет интересно ознакомиться с некоторыми инструментами, специально разработанными для этой задачи. 3 общих из них: Кукольный, шеф-повар и ancible.
spuder
@spuder, а для крупномасштабной архитектуры корпоративного уровня и безопасности управления конфигурацией вы можете использовать CFEngine 3. (Не для слабонервных и не для одноразовых команд.)
Wildcard

Ответы:

38

Q # 1: мне будет предложено ввести пароль sudo только один раз, или мне нужно будет вводить пароль sudo при каждом вызове команды внутри скрипта, для которого требуется разрешение sudo?

Да, один раз, на время работы вашего скрипта.

ПРИМЕЧАНИЕ. Когда вы предоставляете учетные данные sudo, аутентификация обычно длится 5 минут в оболочке, где вы ввели пароль. Кроме того, любые дочерние процессы, которые выполняются из этой оболочки, или любой скрипт, который запускается в этой оболочке (ваш случай), также будут выполняться на повышенном уровне.

Q # 2: есть ли еще вероятность того, что разрешения sudo истечут (если, например, конкретная команда займет достаточно много времени, чтобы превысить время ожидания sudo)? Или первоначальный ввод пароля sudo будет продолжаться в течение всего сценария?

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

выдержка из страницы руководства sudo

Это ограничение зависит от политики; время ожидания запроса пароля по умолчанию для политики безопасности sudoers составляет 5 минут.

SLM
источник
1
Ответ на вопрос 1: «Нет, вам больше не предложат».
dannysauer
@dannysauer - прочитай его вопрос снова. Я говорю «да», чтобы пароль запрашивали только один раз!
SLM
В вопросе говорится «это a или b», и просто сказав «да», не ясно, было ли это «да, а» или «да, б». Просто пытаюсь прояснить вещи для будущих читателей. : D
dannysauer
@dannysauer - смотрите обновление.
SLM
1
Этот новый вопрос будет следующим: stackoverflow.com/questions/3522341/… . sudo -u $(logname) <command>должно сработать.
Готье
17

bashи все его дочерние процессы будут работать с разрешениями суперпользователя. Поэтому вам не нужно будет повторно вводить пароль для команд в вашем скрипте bash.

sudoТайм - аут применяется только к (позже) отдельному вызову sudo. Это не повлияет на ваш уже запущенный процесс bash или любого из его потомков.

Лоуренс Гонсалвес
источник
3

Все эти ответы, вероятно, правильные. Однако это не самый распространенный способ (насколько мне известно) для создания сценариев bash, для которых требуются sudoразрешения. Как правило, в верхней части сценария вы предполагаете, что он не был запущен с sudoразрешениями, и вместо этого вызываете sudo -vсебя (который запросит у пользователя пароль), чтобы «установить» sudo«сеанс». Вы можете добавить echoпояснительный текст перед приглашением или переопределить sudoсобственное приглашение -pпереключателем, чтобы пользователь знал, что вам нужен sudoдоступ для некоторых команд.

Затем в вашем скрипте должно быть нормально вызывать sudoкоманды, которые его требуют (и только те команды, которые его требуют) без дальнейших запросов пароля. Если вы считаете, что определенная группа команд, которые выполняются вместе в вашем скрипте (независимо от их собственного использования sudo), выйдет за пределы тайм-аута sudo, вы можете позвонить sudo -vпосередине, чтобы выполнить своего рода «keep-alive sudo» сеанс. ».

Если sudo«сеанс» действительно истекает во время сценария, у пользователя просто будет запрашиваться его пароль при следующем запуске команды sudo в сценарии.

alexrussell
источник
1
Скажем, одним из шагов сценария является сборка полностью нового ядра Linux, которое может занять, скажем, два часа. Поддержание сессии может быть проблемой, как вы справились с этим?
Готье
Ты не можешь Но в следующий раз, когда вы позвоните, sudo -vон снова запросит у пользователя пароль. Не самая худшая проблема на мой взгляд. Может быть, полезно, чтобы пользователь знал механизм был удобным.
alexrussell
Обратное из этого состоит в том, что пользователь должен вызвать скрипт с sudo для других ответов, а затем sudo -u $SUDO_USERзаставить все команды без полномочий root запускаться без повышенных прав. К сожалению, он добавляет больше кода, но это единственный надежный способ выполнения корневых задач в длительном процессе.
dragon788
Я предполагаю , что я должен уточнить, еще другой способ сделать это было бы назвать Sudo один раз в начале сценария , чтобы поместить временный файл в /etc/sudoers.dиспользовании visudo -c -f /tmp/tempsudoersдля обеспечения файл действителен перед копированием его на место, а затем удалить этот файл один раз сделать (использование ловушки при выходе / ошибке, чтобы гарантировать, что эскалация не может быть использована неправильно). Самая безопасная и надежная реализация позволит вашему пользователю только запускать определенные команды в вашем скрипте с определенными аргументами без пароля, используя NOPASSWD, сохраняя каждую команду / аргументы в массиве для построения файла.
dragon788
Несколько поздно возвращаюсь к @Gauthier здесь, но может показаться, что я ошибся, когда сказал, что нельзя поддерживать sudoсеанс в живых, если отдельная задача занимает больше времени, чем тайм-аут. Я столкнулся с этой техникой на днях в репозитории точечных файлов Матиаса Биненса: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell