我想制作一个shellcript来在Mac上安装Wine 并且我希望用户输入他/她的密码,以便脚本稍后可以通过在“sudo”命令上自动输入密码来使安装无人值守。这就是我现在所得到的:
clear
echo Wine Installer v1.0
echo -------------------
echo by Sydcul
sleep 4
clear
echo "Please enter your OS X user password."
echo "It is needed in some parts of the installation."
read PASSWORD
echo "Wine installation starting."
echo "Please do not shut down your system."
mkdir winetmp
cd winetmp
curl -O https://distfiles.macports.org/MacPorts/MacPorts-2.0.3.tar.bz2
tar xjvf MacPorts-2.0.3.tar.bz2
cd MacPorts-2.0.3
echo $PASSWORD | ./configure && make && sudo make install
echo $PASSWORD | sudo port -v selfupdate
echo $PASSWORD | sudo port -v install xorg
echo $PASSWORD | sudo port -v install wine
rm -rf ~/winetmp
clear
echo "Wine is successfully installed and ready for use!"
但在某一点仍然要求输入密码。 我该如何解决这个问题?
答案 0 :(得分:2)
老实说,我会删除所有$PASSWORD
内容,并从所有命令中删除sudo
。您正在编写安装脚本,该脚本应使用提升的权限运行。让您的用户使用sudo ./installwine.sh
执行脚本,然后在没有sudo
的脚本中运行命令。您的所有port -v
内容都将继承提升的权限。
如果您忘记使用sudo
忘记运行脚本(而不是只是第一次调用port
加密失败),那么您可以向用户提供一条很好的错误消息,您可以查看查看有效用户ID($EUID
)是否为0,并打印错误消息,否则退出。请参阅https://askubuntu.com/questions/30148/how-can-i-determine-whether-a-shellscript-runs-as-root-or-not。
答案 1 :(得分:1)
您可以首次提示用户输入密码,然后将其保存在文件中(不要忘记加密)。
下次需要时,您可以轻松地从同一个文件中读取它并将其存储在变量中,然后使用此命令
echo $variablename | sudo -S command
答案 2 :(得分:0)
实际上我认为sudo不接受来自stdin的密码(你需要指定-S参数来启用它)。 解决方法是执行sudo su以获得所有命令的root权限。
UPD:我不建议将密码保存到文件,因为从安全角度来看这是非常糟糕的解决方案。
UPD2:您忘了Xcode,如果没有安装,此脚本在编译阶段失败:)
答案 3 :(得分:0)
为什么不直接使用sudo的自定义提示选项,并在需要时让它询问密码?
首先检查它们是否已经是root或不是这样的:
SUDO=""
if [[ 0 == $(id -u) ]]
then
SUDO="sudo "
fi
$SUDO command 1
$SUDO command arg arg arg
然后可选择将其与使用-p选项自定义sudo提示的功能相结合。
then
SUDO="sudo -p \"I need elevated access for this part. Please enter %u's password:\" "
fi
您仍然可以控制界面,但除非您需要,否则不要提示输入密码。例如,有些人可能已经为nopassword操作设置了sudo。其他人可能以root身份运行您的安装程或许他们的密码已经用sudo缓存了。等等。最好让sudo管理提示,如有必要,可以使用askpass程序(参见-A选项)。