SSH 远程连接与端口转发:从客户端到服务端
Termux 无 Root 学习开发系列 · 阶段三:网络与远程操作 · 第 10 篇 · 难度:进阶
📚 Termux 无 Root 学习开发系列
阶段一:环境搭建
01 Termux 简介与安装
02 包管理与终端基础
03 共享存储与文件管理
04-05 Vim/Neovim 与 tmux 工作流
阶段二:编程开发环境
06 Python 开发环境搭建
07 C/C++ 开发环境
08 Node.js 开发环境
09 Git 版本控制
阶段三:网络与远程操作
10 SSH 远程连接与端口转发(当前篇)
11 网络工具实战
12 网络代理与安全通信
读完本篇你将能:在 Termux 中使用 SSH 客户端远程连接云服务器和树莓派,通过密钥认证实现免密登录,用 SCP 和 rsync 在手机与服务器之间传输文件,将手机变为 SSH 服务器供电脑远程连入,掌握本地/远程/动态三种端口转发模式建立 SSH 隧道。
前九篇我们搭建了 Termux 环境、配置了编辑器和编程语言、学会了 Git 版本控制。从这篇开始进入阶段三——网络与远程操作。SSH 是这个阶段的核心:它不仅是一条加密通道,更是让手机与服务器、树莓派、电脑之间形成"神经连接"的关键协议。想象你的手机是一座孤岛,SSH 就是海底光缆——数据在加密管道中流动,外人只能看到一堆无法解读的密文。
📑 本文目录
01OpenSSH 安装与版本确认
02SSH 客户端:密码登录与密钥认证
03SSH 配置文件:多主机别名管理
04远程文件传输:SCP 与 SFTP
05rsync 增量同步
06SSH Server:将手机变为 SSH 服务器
07端口转发:三种隧道模式
08autossh 持久连接与 tmux 联动
01 OpenSSH 安装与版本确认
OpenSSH 是 SSH 协议的开源实现,包含客户端(ssh、scp、sftp)和服务端(sshd)。Termux 的包管理器直接提供 openssh 包,一条命令同时安装客户端和服务端。
安装前先更新包列表,确保拿到最新版本:
Bash
pkg update && pkg upgrade -y
pkg install openssh rsync -y
安装完成后验证版本。OpenSSH 10.5 于 2026 年 8 月 11 日发布,是当前最新稳定版,包含多项安全修复和 FIDO 密钥认证顺序优化:
预期输出:
Output
OpenSSH_10.5, OpenSSL 3.5.0 5 Aug 2026
看到 OpenSSH_10.5 说明安装成功。同时安装的还有 scp、sftp、ssh-keygen、ssh-copy-id 等工具,它们都是 OpenSSH 套件的一部分。
💡 小贴士
OpenSSH 10.5 新增了 ssh -Z user@host 模式,可以在连接前预览将尝试哪些公钥以及它们的顺序。当你的 SSH agent 中加载了多个密钥时,这个命令能帮你排查"为什么用了错误的密钥导致认证失败"。
同时确认 rsync 也安装成功:
Bash
rsync --version | head -1
预期输出 rsync version 3.4.1(2025 年发布,当前稳定版)。
02 SSH 客户端:密码登录与密钥认证
有了 SSH 客户端,第一步是连接远程服务器。假设你有一台云服务器(IP 为 8.137.176.208,用户名 root),最基本的连接方式是密码登录:
首次连接会提示指纹确认:
Output
The authenticity of host '8.137.176.208 (8.137.176.208)' can't be established.
ED25519 key fingerprint is SHA256:abc123def456ghi789jkl012mno345pqr678stu901.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入 yes 确认,然后输入密码即可登录。服务器指纹会保存到 ~/.ssh/known_hosts 文件中,之后连接不再提示。
密钥认证:告别密码
每次输入密码既繁琐又不安全。SSH 密钥认证使用非对称加密:你持有一对密钥,私钥留在手机上,公钥放到服务器上。连接时 SSH 自动用密钥握手验证,无需输入密码。
生成密钥对(推荐 ed25519 算法,更短更安全):
Bash
ssh-keygen -t ed25519 -C "termux-phone"
按提示操作:
Output
Generating public/private ed25519 key pair.
Enter file in which to save the key (/data/data/com.termux/files/home/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Your identification has been saved in /data/data/com.termux/files/home/.ssh/id_ed25519
Your public key has been saved in /data/data/com.termux/files/home/.ssh/id_ed25519.pub
一路回车即可,passphrase 可留空(方便自动化脚本)或设置一个密码(更安全)。生成后会有两个文件:
| 文件 |
用途 |
保密级别 |
id_ed25519 |
私钥,留在手机上 |
绝不可泄露 |
id_ed25519.pub |
公钥,放到服务器 |
可公开 |
接下来把公钥上传到服务器,使用 ssh-copy-id 一键完成:
Bash
ssh-copy-id root@8.137.176.208
这是最后一次输入密码。之后直接 ssh root@8.137.176.208 就能免密登录。
如果你的服务器 SSH 不是默认 22 端口,用 -p 指定端口:
Bash
ssh-copy-id -p 2222 root@8.137.176.208
# 之后连接也加 -p 2222
ssh -p 2222 root@8.137.176.208
⚠️ 常见错误
ssh-copy-id -p 2222 root@8.137.176.208 — 在 OpenSSH 10.x 中,ssh-copy-id 的 -p 参数会被正确传递给 ssh,但部分旧版可能不识别
✓ 正确:如果 ssh-copy-id 不工作,手动上传公钥:cat ~/.ssh/id_ed25519.pub | ssh -p 2222 root@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
03 SSH 配置文件:多主机别名管理
当你同时管理多台服务器——云服务器、树莓派、家里 NAS——每次输入完整的 ssh -p 端口 用户名@IP 会非常繁琐。SSH 配置文件让你给每台主机起一个短名。
创建或编辑 ~/.ssh/config:
~/.ssh/config
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# 云服务器
Host cloud
HostName 8.137.176.208
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
# 树莓派(局域网)
Host pi
HostName 192.168.1.100
User pi
IdentityFile ~/.ssh/pi_key
|
配置完成后,连接变得极简:
Bash
# 以前:ssh -p 22 root@8.137.176.208
# 现在:
ssh cloud
ssh pi
SCP 命令也自动使用配置文件中的参数,文件传输同样简化:
Bash
# 上传文件到云服务器
scp app.py cloud:/root/projects/
# 从树莓派下载文件
scp pi:/home/pi/sensor.log ./
💡 小贴士
在 SSH 配置文件中添加 ServerAliveInterval 60 可以每 60 秒发送一个心跳包,防止移动网络切换时 SSH 连接被运营商 NAT 表超时断开。再配合 ServerAliveCountMax 3,3 次心跳无响应才判定断线。
04 远程文件传输:SCP 与 SFTP
SCP(Secure Copy)基于 SSH 协议传输文件,全程加密。它的语法很简单——源路径在前,目标路径在后,远程路径用 主机:路径 格式。
SCP 四种基本操作
Bash
|
1
2
3
4
5
6
7
8
9
10
11
|
# 1. 上传单个文件 → 服务器
scp config.yaml cloud:/root/app/
# 2. 从服务器下载文件 → 手机
scp cloud:/var/log/nginx/access.log ./
# 3. 上传整个目录(-r 递归)
scp -r project/ cloud:/root/
# 4. 服务器之间直接传输(不经过手机)
scp -3 cloud:/data/backup.tar.gz pi:/home/pi/backups/
|
SCP 传输时会显示进度条:
Output
config.yaml 100% 2048 12.3KB/s 00:00
ETA 00:00
SFTP:交互式文件管理
SFTP 比 SCP 更灵活,支持交互式操作——像 FTP 一样浏览远程目录、上传下载文件。连接方式:
进入交互式界面后,常用命令:
sftp>
|
1
2
3
4
5
6
7
8
|
ls # 列出远程文件
lls # 列出本地(手机)文件
cd /root # 切换远程目录
pwd # 查看远程当前路径
put app.py # 上传文件
get data.csv # 下载文件
mkdir backup # 创建远程目录
exit # 退出
|
05 rsync 增量同步
SCP 每次传输都是全量复制——即使文件只改了一个字节,也要重新传输整个文件。rsync 则只传输差异部分,大幅节省带宽和时间。同步大量文件时,rsync 是首选。
基本语法:rsync [选项] 源 目标
Bash
|
1
2
3
4
5
6
7
8
9
10
11
|
# 同步本地目录到服务器(-a 归档模式,-v 显示详情,-z 压缩)
rsync -avz ./project/ cloud:/root/project/
# 从服务器同步到本地(下载)
rsync -avz cloud:/root/logs/ ./logs/
# 删除目标中源端已不存在的文件(镜像同步)
rsync -avz --delete ./notes/ cloud:/root/notes/
# 排除特定文件(如 .git 目录和 __pycache__)
rsync -avz --exclude='.git' --exclude='__pycache__' ./project/ cloud:/root/project/
|
第一次同步传输全部文件,之后只传输有变化的文件。典型输出:
Output
sending incremental file list
app.py
config.yaml
sent 1,523 bytes received 35 bytes 3,116.00 bytes/sec
total size is 48,200 speedup is 30.94
speedup is 30.94 表示实际传输的数据量只有总文件大小的 1/30——这就是增量同步的威力。
⚠️ 常见错误
rsync -avz ./project cloud:/root/project/ — 源路径 project 末尾没有 /,rsync 会把 project 目录本身复制到目标,变成 /root/project/project/
✓ 正确:源路径加 / 表示同步目录内容:rsync -avz ./project/ cloud:/root/project/。记住口诀:有杠传内容,无杠传目录。
06 SSH Server:将手机变为 SSH 服务器
前面都是手机作为客户端连接服务器。反过来,Termux 也能运行 SSH 服务端,让电脑 SSH 连入手机。这在需要从电脑向手机传文件、或远程操控手机终端时非常实用。
Termux 的 SSH 服务端有一个关键限制:Android 不允许非 root 应用绑定 1024 以下端口,所以 SSH 服务不能用标准 22 端口,而是使用 8022。
启动 SSH 服务端
SSH 服务端需要密码认证,先设置密码:
Bash
# 设置密码(输入时不显示字符,正常现象)
passwd
New password:
Retype new password:
passwd: password updated successfully
查看 Termux 用户名(SSH 登录时需要):
输出类似 u0_a234(每台手机不同,这是 Android 为每个 App 分配的 UID)。查看手机 IP 地址:
Bash
ifconfig wlan0 | grep 'inet '
inet 192.168.1.108 netmask 255.255.255.0
启动 SSH 服务:
没有输出就是成功——sshd 在后台运行,监听 8022 端口。现在从电脑上连接:
电脑终端
ssh -p 8022 u0_a234@192.168.1.108
输入刚才设置的密码即可进入 Termux 终端。同样可以用 SCP 从电脑向手机传文件:
电脑终端
# 上传文件到手机
scp -P 8022 document.pdf u0_a234@192.168.1.108:~/
# 从手机下载文件
scp -P 8022 u0_a234@192.168.1.108:~/photos/IMG_001.jpg ./
注意 SCP 的端口参数是大写 -P,而 SSH 客户端是小写 -p——这是一个经典陷阱。
电脑端也可以配置 SSH config 简化连接:
电脑 ~/.ssh/config
Host phone
HostName 192.168.1.108
Port 8022
User u0_a234
之后在电脑上直接 ssh phone 或 scp file phone:~/ 即可。
手机端同样可以用 ssh-copy-id 让电脑免密登录:
电脑终端
ssh-copy-id -p 8022 u0_a234@192.168.1.108
💡 小贴士
手机 SSH 服务端默认不接受公钥认证,需要在启动 sshd 前设置 echo "PubkeyAuthentication yes" >> ~/.ssh/sshd_config。Termux 的 sshd_config 路径是 ~/.ssh/sshd_config,而不是系统标准的 /etc/ssh/sshd_config。
开机自启 SSH 服务
配合 Termux:Boot(阶段一安装的扩展 App),可以实现重启后自动启动 SSH 服务。在 ~/.termux/boot/ 目录下创建启动脚本:
~/.termux/boot/start-sshd
|
1
2
3
4
|
#!/data/data/com.termux/files/usr/bin/sh
termux-wake-lock
sshd
# wake-lock 防止 CPU 休眠导致 SSH 断开
|
赋予执行权限:
Bash
chmod +x ~/.termux/boot/start-sshd
07 端口转发:三种隧道模式
端口转发是 SSH 最强大的功能之一。它把一条 SSH 连接变成一条多功能隧道,可以在不暴露服务端口的前提下,安全地访问远程或本地的网络服务。
三种模式的对比:
| 模式 |
参数 |
方向 |
典型场景 |
| 本地转发 |
-L |
本地 → 远程 |
访问远程内网服务 |
| 远程转发 |
-R |
本地 → 远程暴露 |
内网穿透 |
| 动态转发 |
-D |
本地 SOCKS5 代理 |
代理访问多个服务 |
本地转发 -L:访问远程内网服务
场景:云服务器上运行着一个 MySQL 数据库,只监听 127.0.0.1:3306(不对外开放)。你想在手机上用 MySQL 客户端连接它。通过本地转发,把服务器的 3306 端口映射到手机的 13306 端口:
Bash
ssh -L 13306:127.0.0.1:3306 -N cloud
参数解释:
•
-L 13306:127.0.0.1:3306 — 把本地的 13306 端口转发到远程主机的 127.0.0.1:3306
•
-N — 不执行远程命令,仅做端口转发
•
cloud — 使用 SSH 配置文件中定义的主机别名
这条命令执行后会阻塞(保持隧道打开)。在另一个 Termux 会话中,连接本地 13306 端口就等于连接云服务器上的 MySQL:
Bash(另一个会话)
# 连接本地转发端口,等于连接远程 MySQL
mysql -h 127.0.0.1 -P 13306 -u root -p
远程转发 -R:内网穿透
场景:你在手机上用 Termux 跑了一个 Web 服务(端口 3000),想让外网的人访问。手机没有公网 IP,但你有一台云服务器。通过远程转发,把手机的 3000 端口暴露到云服务器的 8080 端口:
Bash
ssh -R 8080:127.0.0.1:3000 -N cloud
现在访问 http://8.137.176.208:8080 就能访问手机上的 Web 服务。这就是"内网穿透"的基本原理——用一台有公网 IP 的服务器做中转。
⚠️ 常见错误
ssh -R 8080:127.0.0.1:3000 cloud — 远程转发后从外网访问 8080 端口失败
✓ 正确:默认情况下 sshd 只允许远程转发的端口监听 127.0.0.1。需要在云服务器的 /etc/ssh/sshd_config 中设置 GatewayPorts yes,然后重启 sshd,才能让外网访问转发端口。
动态转发 -D:SOCKS5 代理
动态转发创建一个本地 SOCKS5 代理,所有经过代理的流量都通过 SSH 隧道传输。不需要为每个服务单独建隧道——一个 SOCKS5 代理搞定所有:
Bash
# -f 后台运行,-N 不执行命令
ssh -D 1080 -fN cloud
现在本地 1080 端口就是一个 SOCKS5 代理。让 curl 通过代理访问:
Bash
curl --socks5 127.0.0.1:1080 http://httpbin.org/ip
返回的是云服务器的 IP 而非手机的 IP,说明流量确实通过 SSH 隧道走了。也可以设置环境变量让所有命令自动走代理:
Bash
export ALL_PROXY=socks5://127.0.0.1:1080
curl http://httpbin.org/ip
# 现在 curl 自动走代理
💡 小贴士
三种端口转发可以组合使用。例如 ssh -L 13306:127.0.0.1:3306 -D 1080 -fN cloud 同时建立 MySQL 隧道和 SOCKS5 代理。这在管理多台服务器时非常高效——一条 SSH 连接解决多个网络访问需求。
08 autossh 持久连接与 tmux 联动
移动网络的特性是频繁切换——WiFi 和蜂窝之间跳来跳去,地铁里信号断断续续。SSH 连接一旦断开,正在运行的命令就会中断。两个工具可以解决这个问题:autossh 自动重连,tmux 保持会话。
autossh:断线自动重连
安装 autossh:
autossh 包装了 ssh,在连接断开时自动重新建立连接。用法和 ssh 一致,只需在前面加 autossh:
Bash
|
1
2
3
4
5
6
7
|
# 持久 SSH 连接
autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" cloud
# 持久 SOCKS5 代理
autossh -M 0 -D 1080 -fN -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" cloud
# -M 0 禁用 autossh 自带的监控端口,改用 ServerAlive 心跳
|
配合 tmux:断线不丢会话
阶段四学过 tmux 的多窗口工作流。SSH + tmux 是远程管理的黄金组合:autossh 保证 SSH 不断,tmux 保证即使 SSH 断了,服务器上的命令还在跑。重连后 attach 回去即可看到之前的输出。
工作流程:
autossh 连接服务器
→
tmux attach 或 new
→
执行长时间任务
→
断线重连后 attach 回去
实际操作:
Bash
|
1
2
3
4
5
6
7
8
9
10
|
# 1. 连接服务器并创建 tmux 会话
autossh cloud
tmux new -s deploy
# 2. 在 tmux 中执行长时间任务
python3 train_model.py
# 3. 如果断线,重连后恢复
autossh cloud
tmux attach -t deploy
|
重连后终端显示的仍然是 train_model.py 的运行输出——就像从未断开过一样。这就是 tmux + autossh 的威力:手机网络再不稳定,你的远程工作流也不受影响。
✏️ 动手练习
🟢 基础验证
请在 Termux 中完成以下操作:① 安装 openssh 并验证版本号;② 生成 ed25519 密钥对;③ 配置 ~/.ssh/config 添加一个主机别名。如果你没有云服务器,可以用手机自身作为目标——启动 sshd 后从 Termux 内部 ssh -p 8022 用户名@127.0.0.1 连接自己。
🟡 组合应用
在手机上启动 SSH 服务端,从电脑 SSH 连入手机。然后在电脑终端中通过 scp -P 8022 上传一个文件到手机的 Termux 家目录,再在手机上用 ls 确认文件已到达。提示:确保手机和电脑在同一局域网,且手机 IP 正确。
🔴 开放挑战
设计一套完整的"手机远程开发"方案:用 autossh 建立到云服务器的持久连接,配合 tmux 在服务器上保持一个工作会话,再通过 -R 远程转发把服务器上的 Web 服务暴露到公网。要求:写出完整的命令序列和 SSH 配置文件内容,并说明如何在网络切换后自动恢复。提示:可以把 autossh 命令写进 ~/.termux/boot/ 实现开机自启。
📖 知识回顾
OpenSSH 10.5
密钥认证
SSH Config
SCP/SFTP
rsync 增量同步
SSH Server (8022)
本地转发 -L
远程转发 -R
动态转发 -D
autossh 持久连接
tmux 联动
下篇预告
11 网络工具实战:curl、wget 与网络诊断
将学习 HTTP 请求与 API 调试、网络诊断工具(ping/nmap/traceroute/dig)、以及 yt-dlp 下载实战