在我的自定义命令中,Sudo别名不起作用

分享于 

5分钟阅读

电脑

  繁體 雙語

问题:

在我的。bash_profile中,我有额外的命令:

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

基本上是我的安全 rm。 不幸的是 sudo 不能处理它。 在我的。alias sudo='sudo' 我已经找到了一个修正,并且在我的每个别名中都能看到它,但是我现在可以看到它是一个自定义命令/函数,如果我在上面使用我的sudo,我得到的就是

sudo: trash: command not found

谁知道这个问题的解决方法?

我在运行 macOS Mojave。


回答 1:

看起来没有简单的解决方案,可以能是因为sudo可以能是相当危险的&的一些严格安全措施。 但是,一些更精细的解决方案可能是:

  • 你可以使用 declare extra在sudo中使用来实现功能:

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

    或者更简单的:

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

    但是我认为你将会有一些问题得到这个函数的参数,因这里在这种情况下你必须使用另一个答案。

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

    我编写了自己的sudo bash函数,它可以调用函数和别名:

    
    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,它应该支持导出的函数 [ source ]:

    
    your_function () { echo 'Hello, World'; }
    
    
    export -f your_function
    
    
    su -c 'your_function'
    
    
    
    
  • 在( 可能) 中,你可能需要编辑,但你可能需要编辑你的/etc/sudoers 文件,否则你可能需要编辑你的文件,或者执行这里[ 源代码:

    为sudo提供当前路径:

    
    sudo env"PATH=$PATH" your_command
    
    
    
    

    或者在别名中: alias sudo='sudo env"PATH=$PATH" '

  • 我认为你甚至可以将你的整个 .bash_profile 源于 of,集成到上面的一个答案中。


回答 2:

下面是对你的请求的轻微更改,它适用于我的旧 OS X:


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



没有 sudo:

垃圾 file-1 file-2等

使用 sudo:

垃圾的file-1 file-2等


回答 3:

在这种情况下,你希望bash函数基本上像独立脚本那样工作。 因为sudo不知道它,所以使用它作为bash_alias不起作用。 当你做 sudo trash somefile 时,它会在 /root/.bash_alias 中查找脚本,而不是 /home/youruser/.bash_alias。 因为这个函数只作为bash_alias在你自己的用户目录中存在,sudo/root 表示它不存在。 所有你需要做的就是让你的函数对所有用户都可用,包括 sudo ( root )。

通过在 /etc/profile 文件的末尾添加别名,可以解决这个问题,这使得所有用户都可以全局地了解函数,或者在 /usr/bin/trash 中创建bash脚本来执行相同的基本函数。 在后面的场景中,你还需要做 sudo chmod 755/usr/bin/trash 这样所有的用户都可以执行这个程序。

不管哪种方法都适用,但我建议/etc/profile 方法,因为它只是将文件移动到废纸篓的简单别名函数。 没有理由为其他用户限制它。 始终记住考虑使bash_alias对所有用户可用的安全含义。

希望有帮助:)



COM  COMM  Comma  别名  SUDO  
相关文章