使用 `su--login`,--login 的替代方案是什么?

使用 `su--login`,--login 的替代方案是什么?

手册页对于su,表示对于su <name> --login,添加--login使其成为登录 shell。有什么替代方案?我假设由于您要更改用户,因此您必须登录,因此您将自动执行登录 shell。

答案1

你可以指定,也可以不指定--login-l或者-。两种方式都试一下,你就会发现su允许您生成登录或非登录 shell。

我们不是按照定义将为用户生成的第一个 shell 称为“登录 shell”。登录 shell 的启动方式有些不同,因此它知道应该行为不同。并且没有机制强制第一个 shell 成为登录 shell。当您阅读(在链接的答案中):

登录 shell 是当您登录进行交互式会话时,以您的用户 ID 执行的第一个进程

那么记住,事情不必这样。这只是因为

登录过程告诉 shell 充当登录 shell

但一般来说可能不会。它被设计/配置为这样做是因为它最有意义。

登录 shell 的概念允许一个 shell 为自己及其所有后代设置环境(可能还有其他东西,无论它们是什么)。后代中的 shell 不必再次这样做,它会继承。在某些情况下它可能会再次这样做,在某些情况下它不应该这样做,在某些情况下它不能这样做。

在没有先生成登录 shell 的情况下生成非登录 shell 并没有什么根本性的错误或不安全之处。关键在于是否需要登录 shell。

  • 如果用户“从外部”进入,则跳过登录 shell 的操作将导致其进程在可能的基本环境中运行。这对用户来说不是特别有用。登录 shell 正好解决了这个问题。

  • 在某些情况下,环境保持基本状态或由 shell 以外的进程设置。所有后代 shell(如果有)可能都是非登录的。在这种情况下,根本没有登录 shell。

  • 如果已登录的用户使用su bob,则可能有一个有用的环境并su继承它。现在有两种可能性:

    • 用户可能希望一切工作起来就像bob重新登录一样(“从外部”登录)。su --login bob就是这样。注意,它su --login不仅会生成登录 shell;它还会首先准备一个新的最小环境,因此不会留下调用用户环境的残留。

    • 用户可能希望在保留旧环境的同时以另一个用户身份在 shell 中工作。保留环境可能至关重要。这时--login不应使用。

需要明确的是:

我假设由于您正在更改用户,所以您必须登录,因此您将自动执行登录 shell。

这个假设是错误的。没有“必须”,也没有“自动”。由su您决定是否需要登录或非登录 shell,然后相应地调用。

答案2

因为你要更改用户,所以你必须登录

从技术上讲,您不需要。与 Linux 上的许多其他操作一样,“登录”实际上不是一个单一的操作 - 它由几个单独的步骤组成,其中一些步骤可以跳过或重新配置。身份验证、授权、会话设置和实际 UID 更改。

例如,特权进程始终可以通过调用 setreuid() 或类似函数来更改其当前进程凭据(UID、GID、组列表),而无需执行任何其他操作。

(尽管程序应该至少调用 PAM 的“会话设置”阶段,以便它通过 pam_env 加载环境,通过 pam_limit 设置资源限制,通过 pam_systemd 向 logind 注册……)

您必须登录,因此您将自动执行登录 shell。

这些事情彼此之间毫无关联。

  • 登录用户不需要执行任何事物,甚至不需要 shell。例如,图形桌面环境无需真正运行您的“登录 shell”即可让您登录,FTP 或 SFTP 连接也是如此。

  • “登录”shell 与非登录 shell 的唯一区别在于,它被告知要加载不同的初始化脚本。例如,只有在“登录 shell”模式下运行,bash 才会读取 ~/.bash_profile。

相关内容