公众号旧文
为什么每天敲 ssh,但真正干活的却是 sshd
几个月来,我每天打开电脑后,做的第一件事,几乎都是:
ssh root@1.2.3.4
直到刚刚,我在服务器里执行了:
ps aux | grep ssh
想看一下 ssh 的相关进程,结果看到的,却不是我熟悉的 ssh。
而是:
sshd
和:
sshd: root@pts/0
它们只差一个字母。
但职责,却完全相反。
原来 ssh 和 sshd,是 Linux 世界里最经典的一对客户端和服务端。
一、我们看到的 ssh,只是遥控器
当我们输入:
ssh root@1.2.3.4
本机做的事情是发起连接。
ssh 负责的是:
- 去连接远程服务器
- 建立加密通道
- 让你输入密码 / 使用密钥
- 打开一个终端窗口
它的角色,更像是遥控器。
也就是说 ssh 是客户端,是主动发起连接的一方。
二、服务器里真正工作的,是 sshd
sshd 的全名叫 SSH Daemon(守护进程)
在 Linux 世界里,daemon 的意思是一直在后台运行的服务。
sshd 常年待在服务器里,默默做着这些事:
- 监听 22 端口
- 等待别人连接
- 验证身份(密码 / 密钥)
- 创建 shell
- 维持你的会话
也就是说 sshd 才是那个真正干活的人。
三、一次 SSH 登录,真实发生了什么?
假设:
- 你的电脑:192.168.1.10
- 服务器:1.2.3.4
当你敲下:
ssh root@1.2.3.4
真实流程是这样的:
你(ssh)
↓
向服务器 22 端口发起连接
↓
服务器上的 sshd 收到请求
↓
sshd 验证你的身份
↓
sshd 创建一个 shell
↓
你拿到远程终端
一些人可能以为是 ssh 自己完成了一切。
但实际上,如果服务器上没有 sshd,你的 ssh 是连不上的。
四、为什么 Linux 都喜欢加个 d?
扩展阅读:为什么 Linux 里很多程序后面都带一个 d
你可能已经注意到了:
- sshd
- httpd
- crond
- syslogd
- dockerd
这些名字都有一个共同点:结尾都有一个 d
这是 Unix 延续几十年的传统:d = daemon(守护进程)
五、为什么要搞两个程序?
因为它们干的不是同一件事,这是 Unix 的一种分工思维。
Unix 的设计哲学是:
把复杂系统拆成多个小组件,每个组件只做一件事。
所以:
- ssh → 只负责发起连接
- sshd → 只负责接受连接
它们分开,各自简单;组合起来,却很强大。
六、你可以这样记住 SSH
ssh 是我去连接别人 sshd 是别人来连接我
或者更直白一点:你看到的是 ssh,但远端服务器里真正干活的是 sshd。