Bash

如何在 bash 腳本中維護 sudo?

  • February 11, 2016

如果我執行此腳本,如何將超級使用者權限傳遞給它?我寫這個只是為了設置新機器的基礎。我不想以提升的權限執行每個命令,但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" ]
  ...

無論如何,還要檢查您的目標是哪個外殼。IE

等等


要*“保持活力”*,可以執行以下操作

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

引用自:https://unix.stackexchange.com/questions/261103