Sudo 别名对我的自定义命令不起作用

Sudo 别名对我的自定义命令不起作用

在我的 .bash_profile 中我有额外的命令:

trash () { command mv "$@" ~/.Trash ; }

它基本上是我的保险箱rm。不幸的是,sudo它不能用。我找到了一个解决办法,并把它添加alias sudo='sudo '到我的 .bash_profile 中,虽然它可以与我拥有的每个别名一起使用,但正如你所见,它是一个自定义命令/函数,如果我使用我现在的“自定义”,sudo我会得到这个:

sudo: trash: command not found

有人知道如何解决这个问题吗?

我正在运行 MacOS Mojave。

答案1

看起来没有简单的解决方案,也许是因为 sudo 可能相当危险并且有一些严格的安全预防措施。但一些更复杂的解决方案可能是:

  • 只需做一些额外的工作,您就可以使用declare它来“重建” sudo 中的函数[来源]:

       function hello()
        {
            echo "Hello!"
        }
    
        FUNC=$(declare -f hello)
        sudo bash -c "$FUNC; hello"
    

    或者更简单地说:

        sudo bash -c "$(declare -f hello); hello"
    

    但我认为您在获取函数的参数时会遇到一些麻烦,因此在这种情况下您必须使用下面的另一个答案。

  • 这个答案看起来很有趣:

    我已经编写了自己的Sudobash 函数来执行此操作,它可以调用函数和别名:

    function Sudo {
    local firstArg=$1
    if [ $(type -t $firstArg) = function ]
    then
      shift && command sudo bash -c "$(declare -f $firstArg);$firstArg $*"
    elif [ $(type -t $firstArg) = alias ]
    then
      alias sudo='\sudo '
      eval "sudo $@"
    else
      command sudo "$@"
    fi
    }
    
  • 如果你可以使用su,它应该支持导出函数[来源]:

    your_function () { echo 'Hello, World'; }
    export -f your_function
    su -c 'your_function'
    
  • 如果您已经将该功能移至其自己的可执行文件,则 sudo 可能(很可能?)与您的交互式终端不同$PATH,因此您可能需要编辑/etc/sudoers文件,或者执行以下操作[来源

    使用以下命令为 sudo 指定当前 PATH:

    sudo env "PATH=$PATH" your_command
    

    或者使用别名:alias sudo='sudo env "PATH=$PATH" '

  • 我认为你甚至可以.bash_profile用 sudo 来获取你的整体,并将其集成到上面的一个答案中。

答案2

以下是对您的请求的细微更改,它在我的旧 OS X 上运行良好:

trash(){ x=''; [[ $1 = s ]] && { x=sudo; shift; }; $x mv "$@" ~/.Trash; }

不使用 sudo:

垃圾文件-1文件-2等

使用 sudo:

垃圾文件 s 文件-1 文件-2 等等

答案3

在这种情况下,您希望您的 bash 函数本质上像独立脚本一样工作。将其用作 bash_alias 不起作用,因为 sudo 不知道它。当您执行 时sudo trash somefile,它会在 中查找该脚本/root/.bash_alias,而不是/home/youruser/.bash_alias。由于此函数仅作为 bash_alias 存在于您自己用户的主目录中,因此 sudo/root 表示它不存在。您需要做的就是让您的函数可供所有用户使用,包括 sudo(root)。

您可以通过在文件末尾添加别名来解决这个问题/etc/profile,这样可以让所有用户都知道这个函数,或者您可以创建一个 bash 脚本来/usr/bin/trash执行相同的基本功能。在后一种情况下,您还希望sudo chmod 755 /usr/bin/trash这样做,以便所有用户都可以执行该程序。

这两种方法都适用于您的情况,但我建议使用 /etc/profile 方法,因为它只是将文件移至垃圾的简单别名函数。没有理由限制其他用户使用它。始终记住考虑使 bash_alias 可供所有用户使用的安全隐患。

希望有所帮助。:)

相关内容