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: 虚拟终端(VT),充当无网络情况下的本机通信,也就是大部分云主机的救援模式,本质上来说他不依赖于主机商分配给用户的ip通信,而是根据虚拟终端接口开发出来的远程控制
设备:/dev/tty1、/dev/tty2
pts/: 伪终端(PTY),被 GUI 终端、SSH、tmux/screen 使用
设备:/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 根据pid从底部向上查询,用于了解可疑进程的来源

分析案例

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不掉线的原因。

posted @ 2025-10-02 21:23  wenzhuo4657  阅读(1)  评论(0)    收藏  举报