摘要:SSH是远程服务器管理的基础工具,但大多数人只会ssh user@host。本文覆盖密钥认证、config配置、端口转发、跳板机、自动化脚本等进阶用法,让你的远程操作效率翻倍。
密钥认证(免密登录)
# 1. 生成密钥对(如果没有的话)
ssh-keygen -t ed25519 -C "your@email.com"
# 一路回车,默认保存到 ~/.ssh/id_ed25519
# 2. 把公钥复制到服务器
ssh-copy-id user@server
# 等价于手动操作:
# cat ~/.ssh/id_ed25519.pub | ssh user@server 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'
# 3. 测试
ssh user@server # 不需要输密码了
密钥类型选择:
ed25519:推荐,更安全更快rsa:兼容性最好,老系统用这个(至少4096位)
# RSA密钥(兼容老系统)
ssh-keygen -t rsa -b 4096 -C "your@email.com"
SSH Config(告别记IP和端口)
~/.ssh/config:
# 开发服务器
Host dev
HostName 192.168.1.100
User developer
Port 22
IdentityFile ~/.ssh/id_ed25519
# 生产服务器(通过跳板机)
Host prod
HostName 10.0.0.50
User admin
ProxyJump jump
# 跳板机
Host jump
HostName jump.example.com
User ops
Port 2222
# 数据库服务器(只能从prod访问)
Host db
HostName 10.0.0.100
User dba
ProxyJump prod
# 通配符:所有服务器的默认配置
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
使用:
ssh dev # 等于 ssh developer@192.168.1.100
ssh prod # 自动通过jump跳板机连接
scp file.txt dev:~/ # 传文件也能用别名
端口转发(隧道)
本地转发(访问远程服务)
# 场景:服务器上的MySQL只监听localhost:3306,本地想连
ssh -L 3307:localhost:3306 dev
# 现在本地 localhost:3307 → 服务器的 localhost:3306
# 场景:通过跳板机访问内网Web服务
ssh -L 8080:10.0.0.50:80 jump
# 本地 localhost:8080 → 内网 10.0.0.50:80
# 后台运行(不占终端)
ssh -fNL 3307:localhost:3306 dev
# -f 后台运行
# -N 不执行命令
# -L 本地转发
远程转发(暴露本地服务)
# 场景:本地开发的Web服务让外网能访问
ssh -R 8080:localhost:3000 server
# 服务器的 :8080 → 本地的 localhost:3000
# 需要服务器sshd_config开启:
# GatewayPorts yes
动态转发(SOCKS代理)
# 创建SOCKS5代理
ssh -D 1080 server
# 浏览器设置SOCKS5代理 localhost:1080
# 所有流量通过服务器转发
# 后台运行
ssh -fND 1080 server
SSH Config中配置隧道
Host dev-tunnel
HostName 192.168.1.100
User developer
LocalForward 3307 localhost:3306
LocalForward 6380 localhost:6379
# 连接后自动建立MySQL和Redis隧道
文件传输
# scp:简单传文件
scp file.txt dev:~/
scp dev:~/remote-file.txt ./
scp -r ./folder dev:~/ # 传目录
# rsync:增量同步(推荐)
rsync -avz ./project/ dev:~/project/
# -a 归档模式(保留权限、时间等)
# -v 显示详情
# -z 压缩传输
# 排除文件
rsync -avz --exclude='.git' --exclude='node_modules' ./project/ dev:~/project/
# 删除目标多余的文件(镜像同步)
rsync -avz --delete ./project/ dev:~/project/
# 带进度条
rsync -avz --progress ./big-file.tar.gz dev:~/
批量操作
并行执行命令
# 方法1:循环(串行)
for host in dev prod staging; do
echo "=== $host ==="
ssh $host 'uptime && df -h / && free -h'
done
# 方法2:parallel-ssh(并行)
pip install parallel-ssh
# hosts.txt:
# 192.168.1.100
# 192.168.1.101
# 192.168.1.102
pssh -h hosts.txt -l admin -i 'uptime'
Python自动化(Paramiko/Fabric)
# Fabric:高级SSH自动化
# pip install fabric
from fabric import Connection, SerialGroup
# 单台服务器
c = Connection('dev')
result = c.run('uptime', hide=True)
print(result.stdout)
# 传文件
c.put('deploy.sh', '/tmp/deploy.sh')
c.run('chmod +x /tmp/deploy.sh && /tmp/deploy.sh')
# 批量操作
group = SerialGroup('web1', 'web2', 'web3')
group.run('sudo systemctl restart nginx')
# 完整部署脚本
def deploy(c):
with c.cd('/var/www/app'):
c.run('git pull origin main')
c.run('pip install -r requirements.txt')
c.run('python manage.py migrate')
c.run('sudo systemctl restart gunicorn')
for host in ['web1', 'web2']:
deploy(Connection(host))
安全加固
# /etc/ssh/sshd_config
# 禁用密码登录(只允许密钥)
PasswordAuthentication no
# 禁用root登录
PermitRootLogin no
# 修改默认端口
Port 2222
# 只允许特定用户
AllowUsers admin developer
# 限制登录尝试
MaxAuthTries 3
# 应用配置
sudo systemctl restart sshd
防暴力破解:
# fail2ban
sudo apt install fail2ban
# /etc/fail2ban/jail.local
# [sshd]
# enabled = true
# port = 2222
# maxretry = 5
# bantime = 3600
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 查看被封的IP
sudo fail2ban-client status sshd
实用技巧
# 1. 复用连接(加速多次SSH)
# ~/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600
mkdir -p ~/.ssh/sockets
# 2. 断线自动重连
# 安装autossh
sudo apt install autossh
autossh -M 0 -fNL 3307:localhost:3306 dev
# 3. 传输大文件时显示进度
rsync -avz --progress --partial big-file.tar.gz dev:~/
# --partial 断点续传
# 4. SSH跳板机一行命令
ssh -J jump@jump.example.com admin@10.0.0.50
# 5. 远程执行本地脚本
ssh dev 'bash -s' < local-script.sh
# 6. 挂载远程目录(SSHFS)
sudo apt install sshfs
mkdir ~/remote
sshfs dev:/var/www ~/remote
# 像本地目录一样操作远程文件
总结
SSH的核心用法:
- 密钥认证 + config配置 = 日常效率基础
- 端口转发 = 安全访问内网服务
- rsync = 文件同步首选
- Fabric = Python自动化运维
把常用的服务器都配到~/.ssh/config里,是提升运维效率的第一步。