我试图在不查看任何 bash 源代码的情况下编写自己的 shell,但有一件事我无法做到。每当我从任何自定义 shell(包括我自己的 shell)运行“su”时,它都会获取我的密码并将我带到 bash 提示符,其中的哈希值指示 root 权限。我输入了代码,以确保我的 shell 在具有 root 权限时会给出哈希提示,但这只是在以 root 身份运行时,因为每当我尝试从 shell 中使用 su 成为 root 时,它都会强制我执行 bash。有没有什么方法可以让我自己提供su,甚至可能是我的自定义su可执行文件,它只要求root密码并为您提供特权,将您送回您正在使用的shell而不带您进入bash?多谢。
答案1
的手册页su
在这一点上非常清楚:
/etc/passwd
该命令将由为目标用户指定的 shell 执行。
和
-s, --shell 外壳将被调用的 shell。
-m、-p、--保留环境保护当前环境[...]
bash
调用后进入 shell 的原因su -
是这是 root 的默认 shell。我可以看到三种覆盖此默认 shell 的方法:
- 打电话
su -s /path/to/your/shell
而不是仅仅su
- 确保
export SHELL=/path/to/yourshell
已设置然后调用su -m
- 更改 root 的默认 shell
/etc/passwd
(不推荐)
答案2
有没有什么方法可以让我自己提供su,甚至可能是我的自定义su可执行文件,它只要求root密码并为您提供特权,将您送回您正在使用的shell而不带您进入bash?多谢。
不。Unix 中的特权提升机制涉及新进程的执行。该su
可执行文件有一个特殊的权限位,称为“set-user-ID 位”或“setuid”,它会导致该可执行文件执行时,进程的有效用户 ID 就是该可执行文件的所有者的 ID。
如果su
身份验证成功,它将执行一个新的 shell。
在同一 shell 中拥有超级用户权限的常用方法是使用该sudo
实用程序在特权模式下运行各个命令。
如果您经常管理某些计算机,您可以设置一个自定义环境供您作为根用户使用。当您成为 root 后,只需执行您喜欢的 shell,并在 root 的主目录中设置其配置文件。
$ su
password:
root # exec /path/to/favorite/shell
如果您是老板,您可以将该 shell 设置为 root 的登录 shell。