解决 Ubuntu 登录时用户名中不能含有“@”的问题
最近的项目需要在 Linux 中配置自定义的 PAM 做用户认证。在这个 PAM 中,用户名是 Email 的形式。该 PAM 在 CentOS 5.3 下工作正常,但在 Ubuntu 9.04 下,登录过程输入用户名时一旦按下 Email 中的“@”,之前输入的字符就会被清空(相当于 Ctrl-U,kill character 的效果),导致无法登录。我开始认为这是键盘映射的问题,但用 loadkeys 恢复标准键盘映射之后问题依旧。这也不像 stty 的错误,因为在同一个终端上登录到 shell 之后再输入“@”是正常的。于是 google 之,在相关的 HOWTO 页面找到了以下信息:
Under xdm, the default erase and kill characters are # and @, as in good old Unix Version 6.
At the first attempt, you are talking to getty. At the second attempt, you are talking to login, a different program.
看来“@”变成 kill character 不是无中生有,而是有历史依据的;同时输入不了“@”的关键在 getty,而不在 login(实验发现如果第一遍用户名、密码输入错误,第二遍输入用户名时是可以输入“@”的,这印证了问题确实在 getty 而不在 login)。于是我 man getty,发现了问题所在:Ubuntu 上的采用的 getty 是 agetty,而 CentOS 上采用的是 mingetty。agetty 的 Manual 指出,“@”、“#”分别被用作 kill character 和 erase character,而 mingetty 并没有这一非标准的定义。agetty 的 Manual 没有说明如何取消“@”、“#”的特殊功能,我查看了它的源代码(位于 util-linux-ng 包)才发现这个特性是写死在代码中的。看来要在用户名中输入“@”,只能设法绕开 agetty。我的方法是在 Ubuntu 中安装 mingetty,然后设置系统启动时用 mingetty 代替 agetty 开启终端(/etc/event.d/tty*):
重启之后,就可以用 Email 形式的用户名登录了。
建议继续学习:
- python实现自动登录discuz论坛 (阅读:31576)
- 微信扫码登录网页实现原理 (阅读:15587)
- 初探单点登录 SSO (阅读:9284)
- 你会做Web上的用户登录功能吗? (阅读:5567)
- 如何设计用户登录 (阅读:5483)
- perl的expect使用方法,实现非交互式登录。 (阅读:4479)
- 如何让ssh登录更加安全 (阅读:4473)
- Ubuntu 下Hash校验和不符问题的解决 (阅读:4468)
- 什么是OpenID?OpenID概念、原理和案例 (阅读:4267)
- 互联网上的单点登录研究 (阅读:3990)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Jian Lin 来源: 林健的BLOG
- 标签: Ubuntu 登录
- 发布时间:2009-11-17 23:26:45
- [66] Go Reflect 性能
- [66] Oracle MTS模式下 进程地址与会话信
- [65] 如何拿下简短的域名
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [47] 读书笔记-壹百度:百度十年千倍的29条法则