检查是否可以在Bourne shell中以sudo身份运行命令?

时间:2016-07-18 19:41:55

标签: shell unix sh

我正在编写一个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中单独运行命令,但奇迹般地(对我来说)确实有效。但是当我把命令放到一个单独的文件中时,它没有用。

1 个答案:

答案 0 :(得分:5)

有两个直接问题:

  1. $1没有以单引号扩展。

    您可以通过双引号扩展它来解决此问题:sudo sh -c "type '$1'"

  2. 您的命令没有退出。通过将|| (..)替换为|| {..},可以轻松解决这个问题。

    (..)创建一个子shell,限制其中所有内容的范围,包括exit。要对命令进行分组,请使用{..}

  3. 但是,尝试使用sh -c 'type "$1"做任何事情也存在根本问题。

    sudo的一个主要观点是能够限制用户可以做什么和不能做什么。您假设用户具有完全,不受限制的访问权限以root身份运行任意命令,并且任何问题都归因于root没有这些命令可用。

    这对您来说可能是一个有效的假设,但您可能希望改为运行,例如sudo apt --version可以更好地(但仍然不完整)了解您是否允许aptsudo一起运行,而无需完全且不受限制的访问。