如何使用自定义函数启用`sudo`?

Mat*_*ens 6 sudo alias function

最近我了解到您可以启用sudo自定义别名,如下所示:

alias sudo='sudo ' # note: the space is required!
Run Code Online (Sandbox Code Playgroud)

这样做的原因如下:

如果别名值的最后一个字符是空格或制表符,那么还会检查别名后面的下一个命令字的别名扩展。

我的问题是:有什么方法也可以启用sudo自定义功能吗?

Ste*_*ris 1

在一般情况下,您尝试做的事情并没有真正起作用。

对于别名,在传递执行行之前几乎只需重写字符串即可。

因此,举例来说,如果您有

alias sudo='sudo '
alias foo='bar baz'
Run Code Online (Sandbox Code Playgroud)

然后,当您输入sudo foo命令行时,命令行将被重写sudo bar baz然后运行。这是简单的命令行重写。

现在功能更难了。它们不是简单的重写,而是完整的评估;他们可以设置变量、更改目录、打开文件……几乎可以执行shell 可以执行的任何操作。而且,重要的是,它们在当前 shell 的上下文中运行。当你跑步sudo myfunction时,这一切都是不可能的;特别是sudo命令作为子进程运行,因此不会影响当前 shell。

用于解决上述问题的解决方法sudowrap是尝试自动计算sudo bash -c 'myfunction() {...} ; myfunction'。这显式调用一个新的bash子 shell,然后在该子 shell 中运行该函数。显式调用清楚地表明,设置变量之类的事情将不起作用:-)它允许功能的有限子集。

您可以通过这种方式调用的函数类型可能会更好地重写为 shell 脚本而不是函数;然后就sudo可以直接打电话给他们了。http://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.html给出的示例通过duk转换为可执行文件会更容易

#!/bin/bash
exec du -k "$@" | sort -n
Run Code Online (Sandbox Code Playgroud)

然后就会按预期工作!