login命令通常由系统自动调用(如通过getty),普通用户很少直接使用它
login [选项] [用户名]
| 选项 | 说明 |
|---|---|
-p |
保留环境变量 |
-h 主机名 |
指定远程登录的主机名 |
-f |
跳过第二次认证(不推荐) |
--help |
显示帮助信息 |
-u 用户名 |
指定要登录的用户名 |
-H |
设置HOME环境变量 |
--version |
显示版本信息 |
典型的登录过程:
在已登录的会话中切换到另一个用户:
# 使用login命令切换到其他用户
sudo login john
# 或者使用更常见的su命令
su - john
su或sudo来切换用户,而不是直接使用login
模拟远程登录过程:
# 指定远程主机名登录
login -h remote-server.example.com
# 这会记录在日志中,显示来自特定主机的登录
使用-p选项保留当前环境变量:
# 保留环境变量登录新用户
login -p john
# 查看环境变量是否保留
env | grep PATH
在某些自动化场景中,可能需要跳过正常的登录过程:
# 使用SSH密钥登录时可能不需要密码提示
ssh user@host login -f user
# 但这通常由SSH服务器自动处理
在自动化脚本中模拟登录(需要小心使用):
#!/bin/bash
# 自动登录脚本示例
echo "尝试自动登录..."
echo "password123" | login john
# 注意:这种方法不安全,因为密码在命令行中可见
# 实际应用中应使用SSH密钥或expect脚本
在服务器上管理多个虚拟终端:
# 按Ctrl+Alt+F2切换到tty2
# 系统会自动调用login命令显示登录提示
# 查看当前登录的用户和终端
who
# 或
w
# 查看登录历史
last
理解系统启动时的登录初始化:
# 查看系统启动时运行的getty进程
ps aux | grep getty
# 查看getty配置
cat /etc/inittab # 传统SysV系统
# 或
systemctl status getty@tty1.service # systemd系统
# getty会自动调用login命令
配置登录限制和安全策略:
# 创建/etc/nologin文件阻止非root用户登录
echo "系统维护中,请稍后再试" | sudo tee /etc/nologin
# 查看登录失败记录
sudo lastb
# 配置登录超时(在/etc/profile中)
echo "TMOUT=300" | sudo tee -a /etc/profile # 5分钟无操作自动退出
| 配置文件 | 作用 | 示例内容 |
|---|---|---|
/etc/passwd |
用户账户信息 | john:x:1001:1001:John Doe:/home/john:/bin/bash |
/etc/shadow |
用户密码哈希 | john:$6$salt$hash:18000:0:99999:7::: |
/etc/nologin |
阻止非root用户登录 | 包含阻止登录的消息 |
/etc/motd |
登录后显示的消息 | 欢迎信息和系统通知 |
/etc/issue |
登录前显示的消息 | 系统标识和登录提示 |
/etc/profile |
系统范围的shell初始化 | 环境变量和别名设置 |
~/.bash_profile |
用户个人的bash初始化 | 用户特定的环境设置 |
| 命令 | 功能 | 使用场景 | 区别 |
|---|---|---|---|
login |
启动新的登录会话 | 系统初始化登录 | 创建全新的登录会话 |
su |
切换用户身份 | 在已登录会话中切换用户 | 不创建新的登录会话,继承环境 |
sudo |
以其他用户身份执行命令 | 临时获取权限执行命令 | 只执行单个命令,不切换会话 |
ssh |
安全远程登录 | 通过网络登录远程系统 | 加密的网络连接 |
telnet |
远程登录(不安全) | 旧式远程管理 | 明文传输,不推荐使用 |
login命令:
su命令:
su vs su -)su -)简单来说:login是"登录",su是"切换用户"。
在已登录的会话中直接运行login命令通常会导致错误,因为:
login期望在原始终端上运行(由getty调用)尝试直接运行login时可能会看到以下错误:
$ login john
login: cannot open /dev/tty: Device or resource busy
正确的做法是:
# 使用su切换用户
su - john
# 或退出当前会话后重新登录
exit
# 然后系统会显示登录提示
可以自定义登录前后的提示信息:
# 1. 编辑/etc/issue(登录前显示)
sudo nano /etc/issue
# 添加类似内容:
# Welcome to \n
# \l
# 2. 编辑/etc/motd(登录后显示)
sudo nano /etc/motd
# 添加系统公告或欢迎信息
# 3. 编辑/etc/issue.net(远程登录前显示)
sudo nano /etc/issue.net
# 4. 使用动态motd(某些发行版支持)
sudo nano /etc/update-motd.d/00-header
特殊转义序列:
\d - 当前日期\l - 当前终端设备名\m - 硬件架构\n - 主机名\r - 内核版本\t - 当前时间\s - 操作系统名称\v - 操作系统版本登录过程会按顺序执行以下脚本:
/etc/profile - 系统全局配置~/.bash_profile - 用户bash配置(如果使用bash)~/.bash_login - 备选bash配置~/.profile - 备选配置~/.bashrc - bash交互式shell配置/etc/bash.bashrc - 系统bash配置(某些系统)验证执行的脚本:
# 在脚本中添加echo语句来跟踪执行
echo "执行了 /etc/profile" | sudo tee -a /etc/profile
# 查看登录shell类型
echo $SHELL
# 检查当前加载了哪些配置文件
env | grep -E "PATH|HOME|SHELL|USER"
sudo passwd usernamedf -h和du -sh *# 紧急情况下的恢复方法
# 1. 启动时选择恢复模式
# 2. 或使用Live CD/USB启动
# 3. 挂载系统分区并chroot
# 4. 修复配置文件或重置密码