SSH 快速入门
SSH 是远程连接 Linux 服务器的标准方式。本文从基本连接讲到密钥配置和端口转发,覆盖日常开发运维的常见场景。
什么是 SSH
SSH(Secure Shell)是一种加密的网络协议,用于远程登录和管理服务器。相比早期的 Telnet,SSH 所有传输都是加密的,不会被窃听。
开发者最常遇到 SSH 的场景:
- 连接云服务器(AWS、阿里云等)
- GitHub 使用 SSH 协议推送代码
- 端口转发访问远程服务
基本连接
密码登录
ssh user@hostname
ssh user@192.168.1.100
ssh user@example.com -p 2222
-p 指定端口,默认 22。
指定用户名和端口
ssh -p 2222 root@server.example.com
SSH 密钥认证
密钥认证比密码更安全,而且配置一次之后就不用每次输入密码。
生成密钥对
ssh-keygen -t ed25519 -C "your-email@example.com"
-t ed25519— 使用 Ed25519 算法(推荐,更安全更快)-C— 备注,方便识别这个密钥
一路回车使用默认值即可。生成的文件:
| 文件 | 说明 |
|---|---|
~/.ssh/id_ed25519 | 私钥,绝对不能泄露 |
~/.ssh/id_ed25519.pub | 公钥,可以放心分发 |
将公钥上传到服务器
方法一:ssh-copy-id(推荐)
ssh-copy-id user@hostname
自动把公钥追加到服务器的 ~/.ssh/authorized_keys。
方法二:手动复制
# 在本地查看公钥
cat ~/.ssh/id_ed25519.pub
# 登录服务器,追加到 authorized_keys
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
配置 SSH Config
在本地 ~/.ssh/config 中配置常用连接的别名:
Host myserver
HostName 192.168.1.100
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
配置后直接输入 ssh myserver 即可连接,不用记 IP 和用户名。
更完整的配置示例:
# 阿里云开发服务器
Host dev
HostName 47.100.xx.xx
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519
# GitHub
Host github.com
User git
IdentityFile ~/.ssh/id_ed25519
# 跳板机连接内网服务器
Host internal
HostName 10.0.0.50
User admin
ProxyJump dev
ProxyJump实现通过跳板机连接内网服务器。
端口转发
端口转发(Port Forwarding)可以把远程服务器的端口映射到本地,像访问本地服务一样访问远程服务。
本地端口转发
把远程服务器的端口映射到本地:
ssh -L 8080:localhost:3306 user@server
含义:访问本地的 localhost:8080,实际转发到远程服务器的 localhost:3306。典型用途是通过 SSH 隧道安全地访问远程数据库。
远程端口转发
把本地端口暴露给远程服务器:
ssh -R 8080:localhost:3000 user@server
含义:远程服务器上访问 localhost:8080,实际转发到本地的 localhost:3000。典型用途是让别人访问你本地运行的开发环境(配合 ngrok 等工具)。
SOCKS 代理
ssh -D 1080 user@server
在本地创建一个 SOCKS5 代理(端口 1080),所有流量通过 SSH 隧道转发。可用于临时科学上网。
常用命令
文件传输
用 scp 在本地和远程之间传输文件:
# 上传文件到服务器
scp localfile.txt user@server:/remote/path/
# 从服务器下载文件
scp user@server:/remote/path/file.txt ./
# 上传整个目录
scp -r localdir/ user@server:/remote/path/
# 通过自定义 Host 上传(使用 SSH Config 中的配置)
scp localfile.txt myserver:/remote/path/
执行远程命令
不进入交互式 shell,直接执行一条命令:
ssh user@server "df -h"
ssh user@server "systemctl status nginx"
ssh user@server "tail -100 /var/log/app.log"
保持连接不断开
在 ~/.ssh/config 中添加:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
每 60 秒发送一次心跳,防止防火墙因空闲超时断开连接。
速查表
连接:
ssh user@host 基本连接
ssh -p 2222 user@host 指定端口
ssh-copy-id user@host 上传公钥
密钥:
ssh-keygen -t ed25519 生成密钥
~/.ssh/id_ed25519 私钥
~/.ssh/id_ed25519.pub 公钥
文件传输:
scp file host:/path 上传
scp host:/path/file . 下载
scp -r dir host:/path 上传目录
端口转发:
ssh -L 8080:localhost:3306 本地转发
ssh -R 8080:localhost:3000 远程转发
ssh -D 1080 user@host SOCKS 代理
配置文件:
~/.ssh/config SSH 客户端配置
~/.ssh/authorized_keys 服务器授权公钥