Bash
如何在 bash 腳本中維護 sudo?
如果我執行此腳本,如何將超級使用者權限傳遞給它?我寫這個只是為了設置新機器的基礎。我不想以提升的權限執行每個命令,但
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
- https://wiki.debian.org/DashAsBinSh
- https://wiki.ubuntu.com/DashAsBinSh
- https://lwn.net/Articles/343924/
等等
要*“保持活力”*,可以執行以下操作:
while true; do sleep 300 sudo -n true kill -0 "$$" 2>/dev/null || exit done &