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