linux终端和shell,以及sftp配置
问题来源,偶然间我发现我的主机上同时存活了多个shell通过who命令,他们有些已经存活了10天以上,
root@ubuntu:/home/user# who
root tty1 2025-09-19 14:45
user pts/0 2025-10-02 05:42 (154.19.241.170)
user pts/1 2025-09-19 14:14 (:pts/3:S.0)
前置概念
终端: 像是物理设备一样的东西,用于接收实际的电子信号
shell: 使用终端,即一个shell必须使用一个终端才能运行,属于上层应用
常见分类
tty
设备:/dev/tty1、/dev/tty2
pts/
设备:/dev/pts/1、/dev/pts/2
命令详解
who: 查看当前登录用户
who -u: 查看当前存活的用户
who -all: 查看所有,相当于一些选项的集合.
ps 查看进程信息
ps -o pid,ppid,tty,cmd -C sshd 查看ssh相关的进程信息
ps -ft pts/1 查看终端上占用的进程
pstree -sap
分析案例
root@ubuntu:/home/user# who
root tty1 2025-09-19 14:45
user pts/0 2025-10-02 05:42 (154.19.241.170)
user pts/1 2025-09-19 14:14 (:pts/3:S.0)
1,显然tty1是vt虚拟终端,从救援模式中通过exit成功关闭了
2,
(1: 查询终端对应的进程信息
user@ubuntu:~$ who -u
user pts/0 2025-10-02 13:03 . 204732 (154.19.241.170)
user pts/1 2025-09-19 14:14 old 33952 (:pts/3:S.0)
user@ubuntu:~$ ps -ft pts/1
UID PID PPID C STIME TTY TIME CMD
user 33953 33952 0 Sep17 pts/1 00:00:00 /bin/bash
(2: 查询进程的进程所在的进程树
user@ubuntu:~$ pstree -sap 33953
systemd,1 --system --deserialize 45
└─screen,33952 -R qb-web
└─bash,33953
至此,发现pts/1终端是由screen终端启动的。
ps: screen等虚拟终端并不是一定要附着在某个终端上启动,实际上,他可以不附着。
拓展
user@ubuntu:~$ ps -o pid,ppid,tty,cmd -C sshd
PID PPID TT CMD
91878 1 ? sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
204732 91878 ? sshd: user [priv]
204811 204732 ? sshd: user@pts/0
204812 91878 ? sshd: user [priv]
204878 204812 ? sshd: user@notty
user@ubuntu:~$ pstree -sap 204878
systemd,1 --system --deserialize 45
└─sshd,91878
└─sshd,204812
└─sshd,204878
└─sftp-server,204885
SFTP 是走 SSH 协议的“子系统”(通常是 internal-sftp 或 sftp-server),它在服务器端不需要 PTY/终端。跟你 ssh -t 进个交互 shell 不一样,SFTP 是在 SSH 隧道里开的一个独立 channel。
也就是说sftp相当于说一个单独的进程,这也是为什么常见ssh终端工具中sftp掉线,但是shell不掉线的原因。