如何避免根壳嵌套?(POSIX)

Lin*_*eak 0 shell root sudo alias

考虑下面的 Bash 别名,我很快就想到了这个,但我没有时间进一步挖掘:

alias su='sudo -s'
Run Code Online (Sandbox Code Playgroud)

请注意,我正在运行 Bash,但我希望该解决方案是可移植的,因为我可能会在某个时候将其发布到 GitHub 上进行共享。

人们可能遇到的问题是在已经 root 的情况下运行它(该别名)。

演示:

$ su
[sudo] password for vlastimil:                
# su
# su
# 
exit
# 
exit
# 
exit
$ 
Run Code Online (Sandbox Code Playgroud)

有没有办法避免嵌套的 shell 会话?

重要提示:我为我的用户和根用户使用相同的别名文件,而不是分开的。该解决方案必须是可移植的 (POSIX)。

Sté*_*las 6

susudo -s是具有不同 API、语义和行为的不同命令,您不应将其中一个命令别名为另一个命令。

在这里,您似乎想要一个命令来启动 的登录rootshell ,但仅当从非特权 shell 调用时,所以我会编写一个名为的脚本,例如:rootsudorootshell

#! /bin/sh -

die() {
  printf >&2 '%s\n' "$@"
  exit 1
}

[ "$#" -eq 0 ] || die "Usage: $0

Starts a root shell, no argument accepted."

[ "$(id -u)" -eq 0 ] && die "You're already superuser!"

exec sudo -s
Run Code Online (Sandbox Code Playgroud)

添加-u rootsudo命令(或系统上 uid 0 的用户名),如果这不是系统sudo配置中的默认目标用户。

或者,如果您不想创建脚本,请通过包装该代码以将其rootshell() (<that-code>)添加到您的 shell rc 文件中,使其成为 shell 函数(更改$0为函数名称,因为并非所有 shell 都将函数名称放入 中$0)。