GEO*_*GEO 5 bash zsh privileges
好的,首先,我知道这个问题在这里已经被问过几次了,但是给出的答案并不完全让我满意。情况如下:我编写了许多脚本来自动化各种维护任务,目的是完全自动化并且一旦开始就不需要交互。现在,各种任务(例如安装内容等)通常需要 root 权限,但更多时候我不喜欢使用超级用户权限执行命令或整个块(例如 wget,或提取从网络获取的存档等),在最坏的情况下限制损坏。显然,为了满足我的目标,必须根据命令使用sudo或调用脚本su并删除特权并重新获得它们。
现在我已经考虑了一些选择,但它们并没有完全让我满意,因此我想咨询这里的专家,以了解哪个是最好的解决方案(目的是代码易于理解并且对其他人也具有逻辑结构一旦发布):
1.) 将要以非 root 用户身份执行的位分解到外部文件中,并使用su <user> -c /path/to/file. 然而,这种方法有两个缺点:首先,它破坏了脚本的逻辑结构,使事情更难理解和阅读,并在定义和使用变量时产生问题。
2.) 定义别名或函数来缩短su <user> -c "command". 这是一个非常糟糕的主意,因为 80% 的脚本都具有该特权前缀。除此之外,多行命令是有问题的(比如包含我不想以 root 身份运行的命令的结构)。
3.) 类似的东西su <user> << EOF << ... EOF可以正确处理整个代码块。如果没有一个问题困扰我,这将是最优雅的解决方案(因为脚本的逻辑结构没有被破坏):语法高亮。我尝试过的所有主要编辑器都对 here 文档中的整个块使用一种颜色。通读一个 80% 没有语法突出显示的脚本并不是很好。
有没有真正优雅的方法来处理这个问题?su <user> -c ( ...)没有引号的东西会很酷。或者我应该切换到另一个shell?(现在我使用 bash,我听说 zsh 有一个功能可以设置 EUID 变量或类似的东西?)如果没有优雅的解决方案,哪种方法更可取?
与zsh,如果运行为root并且您设置
EUID=1000
Run Code Online (Sandbox Code Playgroud)
它将把 euid 设置为 1000。真正的 uid 仍将设置为 0,因此您可以返回到 EUID 0。您运行的任何程序也可以通过执行 a 来重新获得权限,setuid()但如果目的是防止无意中损害而不是防范恶意软件,那么这就足够了。
#! /bin/zsh -
GID=1000 # optional
EUID=1000 # drop *effective* privileges
some-potentially-harmful-command-that-doesnt-need-superuser
and-another
EUID=0 some-command-that-needs-superuser
more-non-privileged-commands
EUID=0 UID=1000 # now drop privileges with no coming back
# alternatively:
# USERNAME=stephane # sets uid, gid, supplementary groups... based on the user db
Run Code Online (Sandbox Code Playgroud)
请注意,您可以在命令持续时间内设置 EUID/UID...
UID=1000 the-command
Run Code Online (Sandbox Code Playgroud)
但不是UID或USERNAME如果the-command是内置的或函数,则zsh不会派生不同的进程,因此无法恢复真实的用户 ID。
您还可以在子 shell 中设置// EUID:UIDUSERNAME
(EUID=0 USERNAME=stephane; untrusted-application)
Run Code Online (Sandbox Code Playgroud)
(我们将 EUID 设置为 0,以便之后能够切换用户)。
小智 0
3.) 像 su << EOF << ... EOF 这样的东西可以正确处理整个代码块。如果没有一个让我烦恼的问题:语法高亮,这将是最优雅的解决方案(因为脚本的逻辑结构没有被破坏)。我尝试过的所有主要编辑器都对此处文档内的整个块使用一种颜色。通读 80% 没有语法突出显示的脚本并不好。
您应该能够在vim中定义自定义语法突出显示,以使其执行您想要的操作,这篇文章可能也会引起您的兴趣。