当前位置: 首页 > news >正文

终端和shell , 以及XShell 用ssh命令登陆主机的过程

1. 终端(Terminal)—— 负责输入/输出的进程​

  • ​本质​​:

    • 终端是一个​​进程​​(如 gnome-terminaliTerm2Windows Terminal),它管理:
      • ​键盘输入​​(监听用户按键)
      • ​屏幕输出​​(显示文字、控制光标)
      • ​终端设备​​(如 /dev/pts/0
    • 在 Linux/Unix 中,终端的底层由 ​​伪终端(PTY)​​ 驱动实现。
  • ​关键点​​:

    • 终端进程​​不解析命令​​,仅负责:
      • 将用户的键盘输入传递给 Shell 进程。
      • 接收 Shell 进程的输出并显示到屏幕。

2. Shell —— 解析命令的进程​

  • ​本质​​:

    • Shell 也是一个​​进程​​(如 /bin/bash/bin/zsh),它:
      • 从终端进程接收输入(如 ls -l)。
      • ​解析命令​​(处理变量、通配符、管道等)。
      • 通过系统调用如 fork() + exec()执行操作
      • 将结果返回给终端进程显示。
  • ​关键点​​:

    • Shell 可以独立于终端存在(例如执行脚本时),但交互式使用需要终端提供输入/输出环境。

使⽤ XShell 和ssh命令登陆主机的过程

3. 本地 Windows 端的流程​

​(1) 用户在终端(如 PowerShell/CMD)输入命令​

bash

ssh user@192.168.1.100

  • ​终端进程​​(如 conhost.exe 或 Windows Terminal)将输入传递给 ​​Windows Shell​进程​(如 cmd.exe 或 powershell.exe)。
​(2) Windows Shell 调用 ssh.exe 进程​
  • Windows 10+ 内置 OpenSSH 客户端(ssh.exe),Shell 会启动一个 ​​SSH 客户端进程​​:

    bash

    ssh.exe -t user@192.168.1.100

  • 如果使用第三方工具(如 PuTTY),则启动的是 putty.exe 进程。
​(3) SSH 客户端发起 TCP 连接​
  • 客户端向目标服务器(192.168.1.100)的 ​​22 号端口​​发起加密的 TCP 连接。
  • 底层通过 Windows 的 ​​Socket API​​(如 connect())完成网络通信。

​4. 远程 Linux 端的流程​

​(1) SSH 服务端(sshd)监听连接​
  • Linux 服务器上运行的 ​sshd 守护进程​​(默认监听 22 端口)接受连接请求。
  • 通过 fork() 创建一个子进程处理该连接(避免阻塞主进程)。
​(2) 身份验证​
  • 服务端与客户端协商加密算法(如 AES-256),然后验证用户身份:
    • ​密码认证​​:客户端发送加密后的密码,服务端校验 /etc/shadow
    • ​公钥认证​​:客户端使用 ~/.ssh/id_rsa 私钥签名,服务端校验 ~/.ssh/authorized_keys
​(3) 启动远程 Shell​
  • 认证成功后,服务端调用 exec() 启动用户的默认 Shell(如 /bin/bash):
  • bash

    exec("/bin/bash", "-i"); # 交互式 Shell

  • sshd 的子进程通过 exec() 替换为 Shell 后,​​Shell 会继承原子进程的所有资源​​(包括套接字、文件描述符、伪终端 PTY)。此后,​​通信直接发生在 SSH 客户端和远程 Shell 之间​

5. 本地进程关系与通信链​

当你在本地终端输入 ssh user@host 时,进程的层级关系如下:

终端进程(如 gnome-terminal)
└── 本地 Shell 进程(如 bash)└── SSH 客户端进程(如 ssh)
  • ​终端​​:负责显示界面、捕获键盘输入。
  • ​本地 Shell​​:解析命令,启动 SSH 客户端。
  • ​SSH 客户端​​:与远程服务器通信。

​5. 本地终端输入如何传递到 SSH 进程?​

​关键机制:标准输入/输出(stdin/stdout)的继承​
  1. ​终端控制输入/输出​

    • 终端的输入(键盘)和输出(屏幕)默认绑定到 ​​标准流(stdin/stdout/stderr)​​。
    • 当终端启动 Shell 时,Shell 会继承终端的标准流。
  2. ​Shell 启动 SSH 客户端​

    • Shell 通过 fork() + exec() 启动 SSH 客户端进程。
    • ​SSH 客户端会继承 Shell 的文件描述符​​(包括 stdin/stdout/stderr),因此:
      • SSH 的 stdin 来自终端的键盘输入。
      • SSH 的 stdout 输出到终端的屏幕。
  3. ​SSH 客户端独占通信​

    • 一旦 SSH 客户端启动,​​本地 Shell 会挂起​​(等待 SSH 退出),不再处理输入。
    • 此后,终端的所有输入直接传递给 SSH 客户端(因为 SSH 继承了终端的 stdin)。

相关文章:

  • 【Python】EAFP?请求原谅比请求允许容易?
  • 老物件-多功能扩音器拆解
  • vue 指令
  • 高效率者的特点
  • [洛谷刷题10]
  • 路桥塌陷感知监测预警系统解决方案
  • 关闭VSCode 自动更新
  • windows平台监控目录、子目录下的文件变化
  • #跟着若城学鸿蒙# web篇-运动和方向传感器监测
  • 小白学AI DeepSeep 部署中的常见问题及解决方法
  • QMK宏全面实战教程:从入门到精通(附17个实用案例)(理论部分)
  • 5.10品牌日|电商院徐一帆解读:中国企业如何迈向全球品牌
  • 第二天的尝试
  • volatile关键字详解
  • 雷云4 鼠标滚轮单击失灵解决办法
  • Unity 拖尾烟尘效果及参数展示
  • rk3576 gstreamer opencv
  • MySQL中innodb的ACID
  • Spring AI 的功能介绍、集成使用和详细示例说明
  • 安卓中0dp和match_parent区别
  • 阳光保险拟设立私募证券投资基金,总规模200亿元
  • 广西百色“致富果”:高品质芒果直供香港,带动近五千户增收
  • 王伟妻子人民日报撰文:81192,一架永不停航的战机
  • 1至4月全国铁路发送旅客14.6亿人次,创同期历史新高
  • 美国务院批准向土耳其出售导弹及相关部件,价值3.04亿美元
  • 佩斯科夫:俄方代表团15日将在伊斯坦布尔等候乌克兰代表团