ssh · 隔空操作的钥匙

上游:sudo(在服务器端装 SSH 服务要 sudo)· ping(先确认两台机器网络是通的) 下游:scp 跨机器传文件 · rsync 增量同步 · tmux 断线不断任务(Tier 5 待建) 参见:ufw(22 号端口永远第一个放行)· systemctl(SSH 服务本身就是一个 systemd 服务)


一句话是什么

ssh(Secure Shell)让你在自己的电脑上打开一个终端,而这个终端里敲的每一条命令,都在另一台机器上执行。 两台机器之间的所有字符都经过加密,路过的人截到的只是一串乱码。


为什么需要它

Tier 4 结束时,Minecraft 服务器已经跑在 Aaron 房间的那台 Ubuntu 笔记本上了。问题是:

服务器要重启 → 得跑到 Aaron 房间
要看一眼日志 → 得跑到 Aaron 房间
Aaron 在上课,笔记本合着盖放在桌上 → 什么都做不了

有了 ssh,书房的 Mac 上一行命令就能”走进”那台笔记本:

ssh [email protected]

之后的 ls、systemctl status mc-server、sudo ufw status,全部发生在笔记本上。 Tier 1-4 学的每一个命令,从这一刻起都可以隔空使用——这就是 Tier 5 叫”系统管理”的原因:真正的服务器大多放在机房里,没人坐在它前面,管理员全靠 SSH。


核心用法

公式

ssh [选项] 用户名@主机地址 [要执行的命令]
  • 用户名:远程机器上的账号,不是你本机的账号
  • 主机地址:IP(192.168.1.23)或主机名
  • 要执行的命令:可省略。省略就进入交互终端;写了就只执行这一条,然后自动退出

两端各需要什么

角色需要的程序怎么准备
客户端(你坐着的电脑)sshMac 和 Ubuntu 都自带
服务端(被登录的机器)sshd(SSH 守护进程)Ubuntu 桌面版默认没装:sudo apt install openssh-server

客户端和服务端的关系,就像浏览器和网站:你用浏览器访问网站,网站那边得有程序在”接待”。sshd 就是那个接待员,默认守在 22 号端口。

常用命令表

命令说明什么时候用
ssh 用户@主机登录远程机器日常最常用
ssh -p 2222 用户@主机指定端口(非 22)服务器改过端口时
ssh 用户@主机 '命令'只执行一条命令就回来快速查状态
ssh -v 用户@主机显示连接的详细过程连不上时排查
exit 或 Ctrl+D退出远程终端,回到本机用完一定要退
ssh-keygen -t ed25519生成一对密钥配置免密登录
ssh-copy-id 用户@主机把公钥送到服务器配置免密登录

第一次连接:那句看不懂的提问

第一次 ssh 一台新机器,一定会看到:

The authenticity of host '192.168.1.23 (192.168.1.23)' can't be established.
ED25519 key fingerprint is SHA256:Xq3v...(一长串)
Are you sure you want to continue connecting (yes/no/[fingerprint])?

翻译过来是:「我从没见过这台机器,它出示的身份证号是这一串。你确定它就是你要找的那台吗?」

输入 yes 之后,这串”身份证号”会被记进你本机的 ~/.ssh/known_hosts 文件。以后每次连接,ssh 都会核对一遍。

如果哪天看到这个吓人的警告:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

意思是”同一个地址,身份证号变了”。两种可能:

  1. 无害:服务器重装过系统,生成了新的身份证——这是最常见的情况
  2. 有害:有人冒充了这台服务器(中间人攻击)

确认是第 1 种(比如你自己刚重装了 Ubuntu),用这条命令删掉旧记录再连:

ssh-keygen -R 192.168.1.23

不确定原因时不要删——这个警告存在的意义,就是让你停下来想一想。


密钥登录:用钥匙代替密码

每次输密码有两个麻烦:手累,而且密码可能被猜中。SSH 更推荐用密钥对:

文件比喻能不能给别人
~/.ssh/id_ed25519私钥 = 你手里的钥匙❌ 永远不能,谁拿到谁就是你
~/.ssh/id_ed25519.pub公钥 = 配套的锁✅ 可以随便发,装到哪台服务器上都行

原理:你把”锁”(公钥)装在服务器的 ~/.ssh/authorized_keys 里。登录时服务器出一道只有对应钥匙才能解的题,你的电脑用私钥解出来——私钥本身从不离开你的电脑。


Linux 笑话

爸爸在书房开了两个终端窗口:左边是 SSH 进去的 Aaron 笔记本,右边是自己的 Mac。

他想重启一下 Mac,在左边窗口敲下:

sudo reboot

一秒后,左边窗口显示:Connection to 192.168.1.23 closed by remote host.

隔壁房间传来 Aaron 的喊声:「爸爸!我的笔记本自己黑屏了!我的作业还没保存!」

教训:敲任何危险命令之前,先看一眼提示符。

aaron@mc-laptop:~$     ← 你在 Aaron 的笔记本上
dad@MacBook ~ %        ← 你在自己的 Mac 上

提示符里 @ 后面那个名字,就是命令真正要去的地方。


例题精讲

📗 初探 Starter — 第一次登录

# 服务端(在 Aaron 笔记本上,只需做一次)
sudo apt install openssh-server
sudo systemctl status ssh          # 看到 active 说明接待员已上岗
hostname -I                        # 查出笔记本的 IP,比如 192.168.1.23
 
# 客户端(在 Mac 上)
ping -c 3 192.168.1.23             # 先确认网络通
ssh [email protected]             # 第一次会问指纹,输入 yes,再输密码
# 登录成功后提示符变成 aaron@mc-laptop:~$
whoami                             # aaron
exit                               # 回到 Mac

📘 应用 User — 配置免密登录 + 起别名

# 第一步:在 Mac 上生成密钥对(一路回车即可,也可以设一个密钥口令)
ssh-keygen -t ed25519
 
# 第二步:把公钥装到笔记本上(这一步还要输最后一次密码)
ssh-copy-id [email protected]
 
# 没有 ssh-copy-id 时,手动做同样的事:
cat ~/.ssh/id_ed25519.pub | ssh [email protected] \
  'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
 
# 第三步:给这台机器起个短名字
nano ~/.ssh/config

写入:

Host mc-laptop
    HostName 192.168.1.23
    User aaron
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
# 从此只需要:
ssh mc-laptop

ServerAliveInterval 60 的意思是每 60 秒发一次”我还在”,防止长时间不敲键盘被路由器断开。


📙 管理 Admin — 隔空巡检与排障

# 不进终端,一条命令拿到服务器状态
ssh mc-laptop 'systemctl is-active mc-server'      # active
ssh mc-laptop 'df -h /'                             # 磁盘还剩多少
ssh mc-laptop 'sudo journalctl -u mc-server -n 20'  # 最近 20 行日志(可能要输 sudo 密码)

连不上时,报错信息就是线索,按这张表对号入座:

报错意思去查哪个节点
Connection timed out敲门没人应,包被挡或网络不通ping 看通不通,ufw 看 22 端口放没放
Connection refused门是通的,但没人守 22 号门systemctl:sudo systemctl status ssh
Permission denied (publickey)门卫不认你的钥匙chmod:~/.ssh 必须是 700,authorized_keys 必须是 600

为什么权限太宽反而登录不了? sshd 的逻辑是:如果 authorized_keys 谁都能改,那任何人都能偷偷塞一把锁进去——这个文件就不可信了,干脆拒绝。权限是信任的前提。

终端卡死怎么办? 网络断了之后 ssh 窗口常常”冻住”,Ctrl+C 也没反应。依次按 回车 → ~ → .,这是 ssh 自带的紧急断开键。


全英文阅读

摘自 OpenSSH 官方手册 man ssh 的 DESCRIPTION 段:

ssh (SSH client) is a program for logging into a remote machine and for executing commands on a remote machine. It is intended to provide secure encrypted communications between two untrusted hosts over an insecure network.

词意思在这句里
remote远程的、远处的另一台机器
execute执行让命令跑起来
intended to设计目的是说明 ssh 为什么存在
encrypted加密的路人看不懂
untrusted不被信任的双方默认谁也不信谁
insecure不安全的网络本身可能被窃听

读懂这句话的关键:ssh 不假设网络是安全的,也不假设对方是可信的——所以才有指纹核对和密钥认证。前面学的每一步”麻烦”,都是这句设计目标的具体落地。


节点链接

上游(连之前要会的)

  • sudo ← 服务端安装 openssh-server 需要管理员权限
  • ping ← ssh 之前先确认网络是通的

同层排障(连不上时去这些节点找答案)

  • ufw ← 22/tcp 必须放行,而且要在 enable 之前
  • systemctl ← SSH 服务本身由 systemd 管理
  • chmod ← ~/.ssh 目录和密钥文件的权限
  • nano ← 编辑 ~/.ssh/config

下游(Tier 5 待建)

  • scp ← 借 SSH 通道复制文件
  • rsync ← 借 SSH 通道增量同步备份
  • tmux ← SSH 断线后让服务器上的任务继续跑

实战


节点版本:v1.0 · 2026-10-29 Tier 5 首个节点——从这里开始,命令可以隔空执行