大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
SSH:DevOps 远程管理核心
SSH(Secure Shell)是运维登录 Linux 服务器、执行命令、传输文件的标准方式。本课在 linux-essentials 的 linux-ssh 基础上,补充 密钥管理、隧道转发、SSH 配置最佳实践;网络基础见 networking-essentials,配置版本化见 git-essentials,服务器域名解析见 dns-essentials。
学习目标
- 配置 密钥登录 并禁用密码登录(生产环境)
- 使用 SSH 隧道 访问仅监听 127.0.0.1 的服务
- 编写
~/.ssh/config简化多服务器管理
SSH 基础连接
# 生成 ED25519 密钥(推荐)
ssh-keygen -t ed25519 -C "devops@example.com" -f ~/.ssh/id_ed25519
# 复制公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server.example.com
# 登录
ssh user@server.example.com
端口 22/TCP,应用层协议,传输层 TCP,会话加密在 SSH 协议内部完成(类似 OSI L5-L7 合一)。
服务器端加固
编辑 /etc/ssh/sshd_config:
Port 22
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers deploy ops
# 修改前务必保留一个已登录会话,防止锁死
sudo sshd -t # 语法检查
sudo systemctl reload sshd
与 sec-server 一致:禁止 0.0.0.0/0 弱口令 SSH 是服务器安全底线。
SSH 隧道:访问内网服务
CodeRoadMap 的 MySQL :3306 和 backend :8080 通常 仅绑定 127.0.0.1,管理员通过 SSH 隧道访问:
# 本地转发:本机 18080 → 服务器 127.0.0.1:8080
ssh -L 18080:127.0.0.1:8080 user@server.example.com
# 另一个终端
curl http://127.0.0.1:18080/actuator/health
# 本地转发 MySQL
ssh -L 13306:127.0.0.1:3306 user@server.example.com
mysql -h 127.0.0.1 -P 13306 -u app -p
详见 net-vpn 的 SSH 隧道章节。
~/.ssh/config 多主机管理
Host prod
HostName server.example.com
User deploy
IdentityFile ~/.ssh/id_ed25519
LocalForward 18080 127.0.0.1:8080
Host staging
HostName staging.example.com
User deploy
IdentityFile ~/.ssh/id_ed25519_staging
ssh prod # 等价于 ssh deploy@server.example.com -i ~/.ssh/id_ed25519
建议将 config 纳入 git-essentials 管理的 dotfiles 仓库(私钥除外)。
SCP / SFTP 文件传输
# 上传部署包
scp ./app.jar deploy@prod:/opt/app/
# 递归上传目录
scp -r ./config/ deploy@prod:/etc/myapp/
# SFTP 交互式
sftp deploy@prod
sftp> put local.conf /etc/myapp/app.conf
SFTP 走 SSH 通道,比传统 FTP 更安全——下一课对比 FTP。
练习
- 生成 ED25519 密钥并完成
ssh-copy-id免密登录 - 用
-L隧道访问服务器上仅回环监听的 8080 端口 - 编写
~/.ssh/config,为 prod/staging 各建一个 Host 别名
小结
SSH = 加密远程 Shell + 文件传输 + 端口隧道,DevOps 日常第一工具。 生产环境务必密钥登录、禁 root、限 AllowUsers。下一课讲 FTP——遗留系统与批量传输场景。