Как я могу поддерживать sudo в сценарии bash?

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

Как некоторые команды запускаются с помощью sudo а другие запускаются как обычный пользователь?

 #!/bin/sh # If Linux, install nodeJS if $(uname) = 'Linux'; then export IS_LINUX=1 # Does it have aptitude? if -x "which apt-get"; then export HAS_APT=1 # Install NodeJS sudo apt-get install --yes nodejs fi # Does it have yum? if -x "which yum" ; then export HAS_YUM=1 # Install NodeJS sudo yum install nodejs npm fi # Does it have pacman? if -x "which pacman" ; then export HAS_PACMAN=1 # Install NodeJS pacman -S nodejs npm fi fi # If OSx, install Homebrew and NodeJS if $(uname) = 'Darwin' ; then export IS_MAC=1 if test ! "$(which brew)" then echo "================================" echo " Installing Homebrew for you." echo "================================" ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" export HAS_BREW=1 elif -x 'which brew' ; then export HAS_BREW=1 brew update fi # Install NodeJS brew install --quiet node fi # Does it have python? if -x "which python" ; then export HAS_PYTHON=1 if -x "which pip" ; then pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U export HAS_PIP=1 fi fi # Does it have node package manager? if -x "which npm" ; then export HAS_NPM=1 else echo "NPM install failed, please do manually" fi # Does it have ruby gems? if -x "which gem" ; then export HAS_GEM=1 fi 

Остальная часть сценария bash (который я не включал для длины) устанавливает пакеты из массива с использованием npm, apt, yum, brew или pacman, в зависимости от машины. Он устанавливает только простые вещи, такие как git , wget и т. Д.

В первый раз вызывается пароль sudo . Затем, в зависимости от конфигурации, если он вызывается в течение N минут (по умолчанию 5 минут IIRC), вам не нужно снова вводить пароль.

Вы могли бы сделать что-то вроде:

 sudo echo >/dev/null || exit 1 

или, возможно, что-то вроде:

 sudo -p "Become Super: " printf "" || exit 1 

в начале скрипта.

Если вы хотите запретить кому-либо делать sudo ./your_script вы должны также проверить EUID ( bash ):

 if [[ $EUID -eq 0 ]] then printf "Please run as normal user.\n" >&2 exit 1 fi 

или что-то вроде:

 if [ "$(id -u)" = "0" ] ... 

В любом случае также проверьте, какая оболочка вы таргетируете. Т.е.

и т.п.


Чтобы «сохранить его в живых», можно сделать что-то вроде :

 while true; do sleep 300 sudo -n true kill -0 "$$" 2>/dev/null || exit done &