一、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/0tty1
  • 登录时间:用户登录系统的日期和时间
  • 主机名/IP:用户来源的远程主机地址(本地登录不显示)

常用选项

选项说明示例
-H显示列标题who -H
-u显示空闲时间和进程IDwho -u
-q仅显示用户名和登录用户总数who -q
-b显示系统最后一次启动时间who -b
-r显示当前运行级别who -r
-a显示所有信息(相当于 -b -d --login -p -r -t -T -uwho -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:查看当前登录用户

使用 whow 命令查看所有登录用户及其终端信息:

$ 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)名称

注意事项

  1. 需要 root 权限:只有 root 用户才能执行踢人操作
  2. 终端号格式:终端号通常为 pts/N(伪终端)或 ttyN(物理终端)
  3. 使用 w 命令确认:踢人前建议用 w 命令确认该用户的终端号和活动状态
  4. 不可逆操作:用户被踢出后,其未保存的工作将丢失,请谨慎操作

替代方案

如果想禁用某个用户的登录权限而非踢出当前会话,可以使用:

# 禁用用户登录(但不删除账户)
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/*(从)
LinuxUNIX 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,次设备号 2

3. 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)就连接在这个设备上。

标签: none

添加新评论