当前位置: 首页 > news >正文

Linux中的tty与login之间的关系

agetty 进程和 login 进程之间的关系:

一、简要概括

  • agetty 是登录前的终端初始化程序。

  • login 是处理用户登录认证的程序。

  • 关系:agetty 启动后等待用户输入用户名,然后调用 login 进程进行用户认证。


二、详细过程

1. agetty 的作用
  • agettygettyget tty)程序的一个实现,通常由 systemd 或传统的 init 进程启动。

  • 它监听某个终端(如 /dev/tty1ttyS0ttyUSB0);

  • 等待用户输入;

  • 当用户开始交互时,它显示类似:

    CentOS release 7.9 (Final) 
    tty1 login: 
  • 然后它捕获用户名,并执行下一步:

2. agetty 启动 login
  • 一旦 agetty 捕获了用户名,它就调用 /bin/login/usr/bin/login(系统依赖不同)。

  • agetty 通过 exec() 系列函数 替换自身,将控制权交给 login 程序。

3. login 的作用
  • login 接手终端控制;

  • 提示用户输入密码;

  • 验证用户名和密码;

  • 验证通过后,设置用户环境(如 $HOME, $SHELL, $PATH),并执行用户 shell(如 bash);

  • 登录完成后,用户就拥有一个登录 shell。


三、进程关系图(简化)

systemd/init └── /sbin/agetty /dev/tty1 └── exec -> /bin/login└── exec -> /bin/bash (登录成功后) 

四、总结

项目/sbin/agettylogin
角色启动登录界面、捕获用户名用户身份认证,启动用户 shell
运行时机系统启动后由 systemd/init 启动agetty 调用,完成认证
替换关系agettylogin 替换login 被用户的 shell 替换

如果你使用 pspstree 查看,会看到 agettylogin 不会同时存在于同一个终端上。


结合 ps 和 systemd 配置文件举例

我们通过两个部分来举例说明:

  1. systemd 配置如何启动 agetty

  2. ps / pstree 实际显示 agettylogin 的进程关系


一、systemd 中如何启动 agetty

在基于 systemd 的系统(如 CentOS 7、RHEL 7+、Ubuntu 16.04+)中,agetty 是由 systemdgetty@.service 单元管理的。

示例文件:/usr/lib/systemd/system/getty@.service

[Service] 
ExecStart=-/sbin/agetty --noclear %I $TERM 
Type=idle 
Restart=always 

解释:

  • %I 会被替换为终端设备(如 tty1)。

  • $TERM 是终端类型(如 linux)。

  • --noclear 表示不清屏。

启动方式

systemd 会为每个终端生成实例:

systemctl start getty@tty1.service 

开机自动启动:

systemctl enable getty@tty1.service 

二、实际进程关系(使用 pspstree

示例命令一:pstree -p

pstree -p 

部分输出可能如下:

systemd(1)─┬─agetty(1234)───login(1256)───bash(1270) └─... 

解释:

  • agetty(1234) 是在 /dev/tty1 上运行的;

  • 用户开始交互后,agettylogin(1256) 替换;

  • 登录成功后,login 被用户 shell(如 bash(1270))替换。

示例命令二:ps -ef | grep tty1

ps -ef | grep tty1 

在登录前,看到:

root 1234 1 0 10:00 tty1 00:00:00 /sbin/agetty --noclear tty1 linux 

当你输入用户名并登录时,agetty 会被 login 替换,然后再被 shell 替换。此时你可能看到:

root 1270 1256 0 10:01 tty1 00:00:00 -bash 

补充知识:agetty 替换 login 的方式

agetty 最终通过调用类似下面的代码来运行 login

execl("/bin/login", "login", (char *)NULL); 

这个调用会用 login 进程替换 agetty 的镜像,因此它们不会同时存在。


如你希望看到你自己系统上的实际效果,可以:

# 查看所有 agetty 相关的进程 
ps -ef | grep agetty 
# 查看当前终端是 tty 几(如果是本地) 
tty 

相关文章:

  • RHCSA Linux 系统 硬盘管理
  • AI编程对传统软件开发的冲击和思考
  • STM32基本定时器的启动和停止
  • Android中PID与UID的区别和联系
  • vue2 全局指令(输入框自定义限制)
  • 【C++】20. AVL树的实现
  • BU9792驱动段式LCD
  • 解决:dpkg: error: dpkg frontend lock is locked by another process
  • 光伏电站及时巡检:守护清洁能源的“生命线”
  • linux移植lvgl
  • 带您了解工业级网络变压器的浪涌等级测试有哪些条件?
  • Mistral AI 开源最新 Small 模型——Devstral-Small-2505
  • CATIA高效工作指南——常规配置篇(三)
  • 【Nature子刊聚焦:超构表面多维调控与AI驱动的设计革命 ——2024-2025年超构表面领域突破性进展速览 】
  • Day 29 训练
  • 免费在线AI聊天工具
  • 数据同步自动化——如何用Python打造高效工具?
  • 数学建模MathAI智能体-2025电工杯A题实战
  • Linux性能监控:工具与最佳实践
  • 双重攻击锁定饮料巨头,黑客组织宣称窃取可口可乐海量数据
  • 第一次做网站做后感/百度搜索引擎技巧
  • 手机做网站服务器/无锡做网站的公司
  • 有没有做武棍的网站/郑州网站制作公司哪家好
  • 兰州市解封最新消息/seo服务建议
  • 帝国cms地方门户网站模板/青岛网站seo
  • 怎么在一个网站做编辑/seo是什么服