我正在编写一个Bourne shell部署脚本,它以root身份运行一些命令,一些命令以当前用户身份运行。我希望不以root身份运行所有命令,并且如果我需要的命令可用于root(以防止中止的半完成部署),请提前检查。
为了做到这一点,我想创建一个函数来检查命令是否可以作为root运行。我的想法是这样做:
sudo_command() {
sudo sh -c 'type "$1"'
}
然后像这样使用它:
required_sudo_commands="cp rm apt"
for command in $required_sudo_commands do
sudo_command "$command" || (
echo "missing required command: $command;
exit 1;
)
done
你可能会在我的问题中猜到:它不起作用。你们有没有看到我在这里做错了什么?
我尝试在sudo_command中单独运行命令,但奇迹般地(对我来说)确实有效。但是当我把命令放到一个单独的文件中时,它没有用。
答案 0 :(得分:5)
有两个直接问题:
$1
没有以单引号扩展。
您可以通过双引号扩展它来解决此问题:sudo sh -c "type '$1'"
您的命令没有退出。通过将|| (..)
替换为|| {..}
,可以轻松解决这个问题。
(..)
创建一个子shell,限制其中所有内容的范围,包括exit
。要对命令进行分组,请使用{..}
但是,尝试使用sh -c 'type "$1"
做任何事情也存在根本问题。
sudo
的一个主要观点是能够限制用户可以做什么和不能做什么。您假设用户具有完全,不受限制的访问权限以root身份运行任意命令,并且任何问题都归因于root
没有这些命令可用。
这对您来说可能是一个有效的假设,但您可能希望改为运行,例如sudo apt --version
可以更好地(但仍然不完整)了解您是否允许apt
与sudo
一起运行,而无需完全且不受限制的访问。