linux系统登陆用户who-pkill
一、who 命令详解
who 命令用于显示当前登录到 Linux 系统的用户信息,是系统管理员监控用户活动的常用工具。
基本语法
who [选项]... [文件 | 参数1 参数2]默认输出示例
$ who
root pts/0 2024-10-06 13:21 (192.168.3.241)
user1 pts/1 2024-10-06 14:30 (192.168.1.100)输出字段含义:
- 用户名:登录系统的用户账号
- 终端:用户连接的终端设备(如
pts/0、tty1) - 登录时间:用户登录系统的日期和时间
- 主机名/IP:用户来源的远程主机地址(本地登录不显示)
常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-H | 显示列标题 | who -H |
-u | 显示空闲时间和进程ID | who -u |
-q | 仅显示用户名和登录用户总数 | who -q |
-b | 显示系统最后一次启动时间 | who -b |
-r | 显示当前运行级别 | who -r |
-a | 显示所有信息(相当于 -b -d --login -p -r -t -T -u) | who -a |
-T 或 -w | 显示终端消息状态(+ 可写入,- 禁止写入,? 故障) | who -T |
-m | 仅显示与标准输入关联的用户 | who -m |
am i | 显示当前终端对应的原始登录用户 | who am i |
实用示例
# 带标题显示所有登录用户
$ who -H
NAME LINE TIME COMMENT
root pts/0 2024-10-06 13:21 (192.168.3.241)
user1 pts/1 2024-10-06 14:30 (192.168.1.100)
# 显示用户数量统计
$ who -q
root user1
# users=2
# 显示系统启动时间和运行级别
$ who -b
system boot 2024-10-06 10:30
$ who -r
run-level 3 2024-10-06 10:30工作原理
who 命令默认读取 /var/run/utmp 文件获取当前登录用户信息。如果指定文件参数(如 /var/log/wtmp),则可以查看历史登录记录。
二、如何注销其他用户(强制踢人)
只有 root 用户才有权限强制踢出其他登录用户。
步骤1:查看当前登录用户
使用 who 或 w 命令查看所有登录用户及其终端信息:
$ who
root pts/0 2024-10-06 13:21 (192.168.3.241)
user1 pts/1 2024-10-06 14:30 (192.168.1.100)
user2 pts/2 2024-10-06 15:10 (192.168.1.102)或者使用 w 命令获取更详细的信息(包括用户正在运行的进程):
$ w
15:20:23 up 5:10, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.3.241 13:21 0.00s 0.05s 0.00s w
user1 pts/1 192.168.1.100 14:30 5:00 0.02s 0.02s vim config
user2 pts/2 192.168.1.102 15:10 1:30 0.01s 0.01s ssh步骤2:使用 pkill 命令强制踢出用户
确认目标用户的终端号(TTY列,如 pts/1)后,执行以下命令:
pkill -kill -t <终端号>例如,踢出 pts/1 上的用户:
pkill -kill -t pts/1完整操作示例
# 1. 查看当前登录用户
[root@server ~]# who
root pts/0 2024-10-06 13:21 (192.168.3.241)
user1 pts/1 2024-10-06 14:30 (192.168.1.100)
# 2. 强制踢出 pts/1 上的用户
[root@server ~]# pkill -kill -t pts/1
# 3. 验证用户已被踢出
[root@server ~]# who
root pts/0 2024-10-06 13:21 (192.168.3.241)命令参数说明
pkill:根据进程名或其他属性终止进程-kill:发送SIGKILL信号,强制终止进程-t:指定终端(terminal)名称
注意事项
- 需要 root 权限:只有 root 用户才能执行踢人操作
- 终端号格式:终端号通常为
pts/N(伪终端)或ttyN(物理终端) - 使用
w命令确认:踢人前建议用w命令确认该用户的终端号和活动状态 - 不可逆操作:用户被踢出后,其未保存的工作将丢失,请谨慎操作
替代方案
如果想禁用某个用户的登录权限而非踢出当前会话,可以使用:
# 禁用用户登录(但不删除账户)
sudo passwd -l 用户名
# 或
sudo usermod -L 用户名即使你从 aa 用户使用 su - root 切换到 root,你仍然可以踢掉原用户 aa。
测试,aa登录切换root后,登录终端是俩aa用户,踢掉就退出root或断开。
一、pts/0 是什么
pts/0 是 伪终端从设备(Pseudo-Terminal Slave)的设备文件名,是 Linux 系统中用于模拟终端的一种机制。
终端类型对比
| 终端类型 | 设备文件 | 说明 | 示例 |
|---|---|---|---|
| 物理终端 | /dev/tty1-/dev/tty63 | 直接连接到物理硬件(显示器、键盘) | Ctrl+Alt+F1 切换的控制台 |
| 伪终端 | /dev/pts/0-/dev/pts/255 | 由软件模拟的终端,用于远程连接 | SSH、Telnet、xterm、gnome-terminal |
命名规则
pts= Pseudo Terminal Slave(伪终端从设备)0= 设备编号,从 0 开始递增
# 查看当前系统的伪终端
$ ls /dev/pts/
0 1 2 3 ptmx
# ptmx 是伪终端主设备(Pseudo-Terminal Master)
# pts/0, pts/1 是从设备二、伪终端(PTY)的工作原理
1. 有 PTY 吗?
有的。pts/0 本身就是 PTY(Pseudo-Terminal) 的一部分。
PTY 由两部分组成:
应用程序
↓
[从设备] /dev/pts/0 ←── 用户程序读写这里(如 bash、vim)
↓
[主设备] /dev/ptmx ←── 终端模拟器控制这里(如 SSH 服务端)
↓
网络/显示2. 工作流程示例(SSH 连接)
客户端(192.168.1.100)
↓ SSH 协议
SSH 服务端 (sshd)
↓ 创建 PTY 对
主设备 (ptmx) ←──→ 从设备 (pts/0)
↓
bash (shell)
↓
用户命令实际例子:
# 当通过 SSH 登录时,系统分配一个 PTY
$ who
aa pts/0 2024-10-06 13:21 (192.168.1.100)
# 查看这个终端的设备文件
$ tty
/dev/pts/0
# 查看该终端相关的进程
$ lsof /dev/pts/0
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 12345 root 3u CHR 136,0 0t0 6 /dev/pts/0
bash 12346 aa 0u CHR 136,0 0t0 6 /dev/pts/0
bash 12346 aa 1u CHR 136,0 0t0 6 /dev/pts/0
bash 12346 aa 2u CHR 136,0 0t0 6 /dev/pts/0可以看到:
- sshd 进程持有主设备端的连接
- bash 进程使用从设备
/dev/pts/0作为标准输入/输出/错误
三、PTY 的完整架构
1. 历史演变
| 时代 | 机制 | 设备文件 |
|---|---|---|
| 传统 Unix | 旧式 PTY | /dev/ptyXX(主),/dev/ttyXX(从) |
| System V | 新式 PTY | /dev/ptmx(主),/dev/pts/*(从) |
| Linux | UNIX 98 PTY | /dev/ptmx + /dev/pts/* |
2. 设备文件类型
# 查看设备文件类型
$ ls -l /dev/pts/0
crw--w---- 1 aa tty 136, 0 Oct 6 13:21 /dev/pts/0
# c 表示字符设备
# 主设备号 136(pts 从设备)
# 次设备号 0(设备编号)
$ ls -l /dev/ptmx
crw-rw-rw- 1 root root 5, 2 Oct 6 13:21 /dev/ptmx
# 主设备号 5,次设备号 23. PTY 的创建过程
// 简化版 PTY 创建流程(C语言)
int master = open("/dev/ptmx", O_RDWR); // 打开主设备
grantpt(master); // 授权从设备
unlockpt(master); // 解锁从设备
char *slave_name = ptsname(master); // 获取从设备名,如 "/dev/pts/0"
int slave = open(slave_name, O_RDWR); // 打开从设备
fork(); // 创建子进程
// 子进程使用 slave,父进程使用 master四、实际验证 PTY
方法1:查看进程的终端关联
# 查看当前终端类型
$ tty
/dev/pts/0
# 查看所有进程及其终端
$ ps aux | grep -E "TTY|pts"
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 0.0 0.1 12345 1234 pts/0 Ss 13:21 0:00 -bash
aa 1235 0.0 0.1 12346 1235 pts/0 S 13:21 0:00 \_ vim
root 5678 0.0 0.0 5678 567 pts/1 Ss+ 14:30 0:00 /usr/sbin/sshd方法2:使用 lsof 查看 PTY 使用情况
# 查看所有打开的伪终端
$ lsof | grep pts | head -10
sshd 1234 root 0u CHR 136,0 0t0 6 /dev/pts/0
sshd 1234 root 1u CHR 136,0 0t0 6 /dev/pts/0
sshd 1234 root 2u CHR 136,0 0t0 6 /dev/pts/0
bash 1235 aa 0u CHR 136,0 0t0 6 /dev/pts/0
bash 1235 aa 1u CHR 136,0 0t0 6 /dev/pts/0
bash 1235 aa 2u CHR 136,0 0t0 6 /dev/pts/0方法3:查看 PTY 限制
# 系统最大伪终端数量
$ cat /proc/sys/kernel/pty/max
4096
# 当前已使用的伪终端数量
$ cat /proc/sys/kernel/pty/nr
3五、总结
| 概念 | 解释 |
|---|---|
pts/0 | 伪终端从设备文件,代表一个虚拟终端会话 |
| 有 PTY 吗 | 有,pts/0 本身就是 PTY 架构的一部分 |
| PTY 组成 | 主设备 /dev/ptmx + 从设备 /dev/pts/* |
| 常见用途 | SSH 登录、终端模拟器(xterm、gnome-terminal)、screen/tmux |
| 与物理终端区别 | 物理终端(tty1-6)直接连接硬件,伪终端由软件模拟 |
简单来说:当你通过 SSH 登录 Linux 时,系统会为你创建一个 PTY(伪终端),而 /dev/pts/0 就是这个 PTY 的从设备,你运行的 shell(如 bash)就连接在这个设备上。