Я хочу написать автоматический скрипт после установки в Bash (называется post-install.sh
, например). Скрипт автоматически добавляет и обновляет репозитории, устанавливает и обновляет пакеты, редактирует файлы конфигурации и т. Д.
Теперь, если я выполню этот скрипт, например, с помощью sudo post-install.sh
, мне будет предложено ввести sudo
пароль только один раз, или мне нужно будет вводить sudo
пароль при каждом вызове команды внутри скрипта, что требует sudo
разрешения? Другими словами, команды внутри скрипта bash «наследуют», так сказать, разрешения на выполнение?
И, если это действительно так , есть ли еще вероятность того, что sudo
разрешения истечут (если, например, конкретная команда займет достаточно много времени, чтобы превысить время sudo
ожидания)? Или начальный sudo
ввод пароля будет длиться в течение всего времени действия сценария?
источник
Ответы:
Да, один раз, на время работы вашего скрипта.
ПРИМЕЧАНИЕ. Когда вы предоставляете учетные данные
sudo
, аутентификация обычно длится 5 минут в оболочке, где вы ввели пароль. Кроме того, любые дочерние процессы, которые выполняются из этой оболочки, или любой скрипт, который запускается в этой оболочке (ваш случай), также будут выполняться на повышенном уровне.Нет, они не будут задерживаться в сценарии. Только если вы в интерактивном режиме набирали их в оболочке, где были предоставлены учетные данные. Каждый раз, когда
выдержка из страницы руководства sudosudo
выполняется в этой оболочке, время ожидания сбрасывается. Но в вашем случае их учетные данные будут оставаться до тех пор, пока скрипт выполняет и запускает команды из него.источник
sudo -u $(logname) <command>
должно сработать.bash
и все его дочерние процессы будут работать с разрешениями суперпользователя. Поэтому вам не нужно будет повторно вводить пароль для команд в вашем скрипте bash.sudo
Тайм - аут применяется только к (позже) отдельному вызовуsudo
. Это не повлияет на ваш уже запущенный процесс bash или любого из его потомков.источник
Все эти ответы, вероятно, правильные. Однако это не самый распространенный способ (насколько мне известно) для создания сценариев bash, для которых требуются
sudo
разрешения. Как правило, в верхней части сценария вы предполагаете, что он не был запущен сsudo
разрешениями, и вместо этого вызываетеsudo -v
себя (который запросит у пользователя пароль), чтобы «установить»sudo
«сеанс». Вы можете добавитьecho
пояснительный текст перед приглашением или переопределитьsudo
собственное приглашение-p
переключателем, чтобы пользователь знал, что вам нуженsudo
доступ для некоторых команд.Затем в вашем скрипте должно быть нормально вызывать
sudo
команды, которые его требуют (и только те команды, которые его требуют) без дальнейших запросов пароля. Если вы считаете, что определенная группа команд, которые выполняются вместе в вашем скрипте (независимо от их собственного использованияsudo
), выйдет за пределы тайм-аута sudo, вы можете позвонитьsudo -v
посередине, чтобы выполнить своего рода «keep-alivesudo
» сеанс. ».Если
sudo
«сеанс» действительно истекает во время сценария, у пользователя просто будет запрашиваться его пароль при следующем запуске команды sudo в сценарии.источник
sudo -v
он снова запросит у пользователя пароль. Не самая худшая проблема на мой взгляд. Может быть, полезно, чтобы пользователь знал механизм был удобным.sudo -u $SUDO_USER
заставить все команды без полномочий root запускаться без повышенных прав. К сожалению, он добавляет больше кода, но это единственный надежный способ выполнения корневых задач в длительном процессе./etc/sudoers.d
использованииvisudo -c -f /tmp/tempsudoers
для обеспечения файл действителен перед копированием его на место, а затем удалить этот файл один раз сделать (использование ловушки при выходе / ошибке, чтобы гарантировать, что эскалация не может быть использована неправильно). Самая безопасная и надежная реализация позволит вашему пользователю только запускать определенные команды в вашем скрипте с определенными аргументами без пароля, используяNOPASSWD
, сохраняя каждую команду / аргументы в массиве для построения файла.sudo
сеанс в живых, если отдельная задача занимает больше времени, чем тайм-аут. Я столкнулся с этой техникой на днях в репозитории точечных файлов Матиаса Биненса:while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13