我尝试/usr/bin/agetty -
在终端模拟器(基于 X 的和基于内核的)中从 bash 进行调用,然后它要求我输入用户名,但是在输入该用户名后,它只是“冻结”了一会儿,然后让我返回进入我原来的 bash 推广。
我开始想知道,agetty 是systemd
使用 ttyx 设备作为服务启动的,execve(/usr/bin/login)
因此它会给我登录升级,因为登录配置为pam_systemd
,因此将创建一个 systemd 会话。但这不是我agetty -
如上所述直接运行时得到的结果,当我检查时没有创建新会话systemctl status
。
然后我想如果是因为agetty以普通用户身份运行,它可能会检查自己的EUID或其他东西,但这只会导致我的bash在我输入用户名后退出。
好吧,我systemctl status
又检查了一下,它告诉我 systemd 运行这个程序/sbin/agetty -o -p -- \u --noclear tty2 linux
,好吧,我在 tty2 上以 root 身份登录,然后运行agetty -o -p -- \u --noclear - linux
,我得到了和一开始完全相同的情况——我又回到了 bash。
我需要理解这些实验结果。
我正在使用 ArchLinux,/usr/bin/login
并且/usr/bin/agetty
都来自软件包util-linux 2.33-2
。
答案1
显然“递归login
”曾经用来做一些有用的事情,但现在人们预计它不会在 Linux 上工作一段时间了。
我建议坚持使用更常用的技术,例如非递归login
、 orsu
和sudo
,因为对于当前系统来说,这些技术可以更好地理解、记录等。
如果可能,请避免su
使用su -l
,因为这会为您提供一组干净的环境变量。
我愿意不是知道为什么您会看到您所描述的具体结果。但是,如果您确实需要了解“递归”的行为login
,我可以想到您需要了解的两个具体点,即它可能会出现什么问题。
错误
不支持未记录的 BSD -r 选项。某些 rlogind(8) 程序可能需要这样做。
在过去的美好时光中,递归登录不再有效;对于大多数用途,su(1) 是令人满意的替代品。事实上,出于安全原因,login 执行 vhangup() 系统调用来删除 tty 上任何可能的侦听进程。这是为了避免密码嗅探。如果使用命令登录,则周围的 shell 会被 vhangup() 杀死,因为它不再是 tty 的真正所有者。
--
man login
如果您使用 systemd,它会跟踪登录会话,但不允许它们嵌套。这是一个刻意的选择关于 systemd 登录会话应如何与“audit
会话”交互。 su
/sudo
不要转义当前的“audit
会话”。
目前,我每次运行时都可以看到 systemd 嘈杂地记录此设计sudo
。不要问我为什么这被认为是可取的......
sudo[1079]: pam_systemd(sudo:session): Cannot create session: Already running in a session
全面披露:引文man login
继续:
如果使用命令登录,则周围的 shell 会被 vhangup() 杀死,因为它不再是 tty 的真正所有者。通过
exec login
在顶级 shell 或 xterm 中使用可以避免这种情况。