1

以下代码检查您是否具有 root 权限,然后使用它再次运行脚本:

    CMDLN_ARGS="$@" # Command line arguments for this script (if any)
    export CMDLN_ARGS
    func_check_for_sudo() {
        if [ ! $( id -u ) -eq 0 ]; then
                echo "You may be asked for your login password for [`whoami`]." ;sleep 1
                LAUNCH="`dirname \"${0}\"`"
                exec sudo -S su -c ${LAUNCH}/$(basename ${0}) ${CMDLN_ARGS}
        exit ${?}
    fi
    }

出了问题的地方是当我将此脚本放在“$HOME/bin”文件夹或其他东西中时,我可以在没有路径的情况下启动它。它给了我错误“没有这样的文件或目录”。我需要脚本来获取该信息并将其正确传递给 exec。

我的问题是:如何在没有路径的情况下从脚本中正确获取 /path/to/script_name ?回顾一下,我调用 MY_SCRIPT insead /path/to/MY_SCRIPT 这会破坏我的脚本,因为它必须检查 root 权限,如果你没有它,它必须再次运行。

基本上,有问题的代码行是 ${0} 是脚本名称(如果你用一个来调用它,则带有路径):

    exec sudo -S su -c ${0} ${CMDLN_ARGS}
4

1 回答 1

3

这里有几个问题:

  • 找到脚本的路径。有几种简单的方法可以做到这一点:使用"$BASH_SOURCE"而不是$0; 或者只是利用(至少在默认情况下)sudo 保留 $PATH 的事实,因此sudo "$0" ...可以很好地解析脚本。
  • 第二个是脚本没有正确保留它的参数。参数中的空格将被误认为是参数之间的中断,并且通配符将被错误地扩展。这是因为CMDLN_ARGS="$@"将所有参数用空格分隔在一起,然后${CMDLN_ARGS}在空格上重新分割(可能不一样)并且还扩展了通配符。

这是我纠正问题的看法。请注意,将处理程序放在函数中只会增加一层不必要的复杂性,所以我只是将它内联。我还使用 sudo 的 -p 选项稍微清理了提示。

if [ $( id -u ) -ne 0 ]; then
    exec sudo -p "Login password for %p: " "$0" "$@"
    exit $?
fi
于 2012-11-11T04:32:50.150 回答