需要 sudo 密码的 Bash 脚本
Posted
技术标签:
【中文标题】需要 sudo 密码的 Bash 脚本【英文标题】:Bash scripts requiring sudo password 【发布时间】:2011-04-27 22:37:34 【问题描述】:我正在创建一个 Bash 安装程序脚本,它为 OSX 和 Linux 编译和安装一些库。因为我的脚本中的某些命令(“make install”、“apt-get install”、“port install”等)需要 sudo,所以我需要用户提供密码。
目前,每当第一个 sudo 命令即将执行时,都会要求用户输入密码,但由于这通常是在编译阶段之后,所以在启动脚本和必须输入密码之间总是有一段时间。
我想把密码输入+检查放在脚本的开头。我也很好奇这是否真的是安装系统库的好方法。
或者,我可以将库安装在不需要 sudo 的本地沙箱位置,但是我必须告诉 apt-get 和 macports 在哪里安装它们的库,而不是默认的 /usr/local/ 和 / opt/local,我不知道该怎么做,也不知道这是不是一个聪明的主意。
【问题讨论】:
【参考方案1】:要获取密码,只需在脚本开头输入sudo echo "Thanks."
。
但我更喜欢这个解决方案:
if [[ $UID != 0 ]]; then
echo "Please run this script with sudo:"
echo "sudo $0 $*"
exit 1
fi
【讨论】:
如果可以直接sudo
,为什么要echo
sudo?
@TobiasKienzler:因为问题要求它。
我在 Solaris 上使用 $UID 时遇到了问题——使用 sudo 运行脚本时 var 为空白。所以我不得不检查id -u
。
我知道这是一个老问题,但是对于遇到它的其他人,如果您想提示他们输入密码而不回显任何文本,您可以使用sudo echo -n
。 -n
用于抑制尾随换行符。
这将要求允许用户在 sudoers 策略中以 root 身份运行 echo,这将是一个奇怪的策略(除了可能允许用户以所有用户身份运行所有命令的桌面框所有主机...)。【参考方案2】:
对于那些不想提升整个脚本的人(通过仅在需要的脚本中使用 sudo 来限制风险),接受的答案的第一部分 sudo echo "Thanks"
有效,但不会通过以下方式响应 sudo 密码失败退出脚本。为此,包含 sudo 命令并希望在使用之前确保 sudo 访问的脚本可以以
if [[ ! $(sudo echo 0) ]]; then exit; fi
需要注意的是,您依赖于 sudoers 超时的存在,该超时将持续脚本的持续时间来抑制其余提示。
【讨论】:
【参考方案3】:另一种方法:
function checkSudo()
if ((EUID != 0)); then
echo "Granting root privileges for script ( $SCRIPT_NAME )"
if [[ -t 1 ]]; then
sudo "$0" "$@"
else
exec 1>output_file
gksu "$0" "$@"
fi
exit
fi
【讨论】:
【参考方案4】:也许更容易阅读:
[ $(whoami) == "root" ] || exit
【讨论】:
默认情况下不会退出 ....[ $(whoami) == "root" ] || (echo "No." && exit 1)
以上是关于需要 sudo 密码的 Bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章