我在读APUE它一直引用该login
程序,但我仍然不知道它在我的操作系统(Ubuntu)中做什么。
§8.11:
通常情况下,真实的用户ID是
login(1)
我们登录时程序设置的,永远不会改变。因为login
是超级用户进程,所以它在调用 setuid 时设置所有三个用户 ID
ps aux | grep login
:
root 840 0.0 0.0 70732 6120 ? Ss 15:13 0:00 /lib/systemd/systemd-logind
root 1120 0.0 0.0 419680 9468 ? Sl 15:13 0:00 gdm-session-worker [pam/gdm-autologin]
tianhe 1151 0.0 0.1 445184 20540 ? SLl 15:13 0:05 /usr/bin/gnome-keyring-daemon --daemonize --login
tianhe 10838 0.0 0.0 21536 1060 pts/0 S+ 21:50 0:00 grep --color=auto login
简而言之,这个login
程序为操作系统提供了哪些功能?
在什么情况下使用或运行?
login
顺便说一句,与 相比如何ssh
?
答案1
它不是让您交互式运行的命令。
该login
命令通常不在命令行上输入。
-login
手动的。 IBM AIX 7.2
它曾经是。早在 20 世纪 80 年代,这种方法就可行,C-shell 用户甚至有一个方便的login
内置命令,可以连接exec
外部login
程序,用该程序覆盖 shell 进程,该程序被设置为超级用户的 UID。
但现在的操作系统已经不能像 20 世纪 80 年代的 BSD 那样工作了。 A登录会话(顺便说一下,这是那里讨论的会话类型)要经历太多单向陷门(用户安全上下文、控制组、更改 UID“污点”标记、AIXsetsenv
等等)才可行从进程中为任意用户正确启动新的登录会话已经在用户登录会话。
无论如何,由于 20 世纪 90 年代 PAM 的出现,将被新login
程序覆盖的 shell 进程不再像 20 世纪 80 年代那样是树中最顶层的进程。它现在是一个监督进程的子进程,负责 PAM 会话的设置和拆卸。
这就是为什么“守护进程化”是一个谬论,也是为什么login
从现有登录会话中运行并不真正明智。
它是一个系统程序。
login
被调用终端登录服务,通常是直接的,在服务或服务管理基础设施设置了一些环境变量之后,打开终端设备并初始化/推送线路规则,将其设置为控制终端,并用一些控制序列初始化终端。
- 在 1987 年的 AT&T Unix System 5 Release 4 上,这些服务将由
ttymon
服务访问设施的一部分管理。如今,您仍然可以在 OpenSolaris 及其衍生产品(例如 Illumos 和 Schillix)上看到这些内容。 - 在 systemd Linux 操作系统上,这些是服务(通常是服务的别名)。这是宇宙中 System 5 方面值得注意的奇特之处,当几乎没有其他人这样做时,仍然使用程序来调用。
autovt@something
getty@something
getty
login
- 在操作系统上使用诺什工具集对于服务管理来说,这些就是服务。
ttylogin@something
- 在宇宙的 BSD 方面,如果不使用 nosh 服务管理,这些服务是根据表由进程 #1 生成的服务
/etc/ttys
。
如果您登录虚拟终端或真实终端,系统会login
提示您输入密码,也可能提示您输入用户名,然后继续调用交互式登录 shell。
login
不用于 SSH 登录。也没有被使用图形用户界面登录。这两者的操作方式不同,都使用其他程序。 login
期望通过文本用户界面与终端对话。
它是由旧的 Berkeley rlogin 系统使用,但现在您不应该使用它。对所谓的伯克利“r-”命令的进一步讨论远远超出了本答案的范围。所以我只想说,现在的做法已经不再像 20 世纪 80 年代那样了。
进一步阅读
- 乔纳森·德博因·波拉德。 ”终端”。小吃指南。软件。
- 乔纳森·德博因·波拉德 (2018)。
getty
产生于init
已成为过去。。经常给出的答案。 - https://unix.stackexchange.com/a/446619/5132
答案2
您可能登录到窗口会话,在这种情况下,显示管理器xdm
,gdm
...kdm
将使您登录。但是还有其他登录方式。例如,我们可以通过网络使用(正如您所指出的)ssh
。如果我们在本地登录,但没有登录到窗口系统,那么我们需要一个不同的登录程序。这就是登录的用武之地。
尝试按ctrlaltf1,登录,然后查看正在运行的进程。是什么让你登录的。