SSH 使用#
参考文档:ssh
安装与启动#
Ubuntu/Debian 系统#
服务管理#
# 启动 SSH 服务
sudo systemctl start ssh
# 或使用传统方式
sudo service ssh start
# 停止服务
sudo systemctl stop ssh
# 重启服务
sudo systemctl restart ssh
# 设置开机自启
sudo systemctl enable ssh
# 查看服务状态
sudo systemctl status ssh
🔑 密钥认证登录#
密钥对生成#
# 生成 RSA 密钥对(默认 3072 位)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 指定保存路径和文件名
ssh-keygen -f ~/.ssh/my_key -t rsa -b 4096
公钥部署到服务器#
# 方法1:使用 ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip
# 方法2:手动复制
# 本地执行:
cat ~/.ssh/id_rsa.pub
# 在服务器上执行:
mkdir -p ~/.ssh
echo "粘贴的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
使用密钥连接#
⚙️ 服务器配置#
配置文件位置#
常用配置选项#
# 修改监听端口(默认 22)
Port 2222
# 允许密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 禁用密码登录(增强安全)
PasswordAuthentication no
# 允许 Root 登录
PermitRootLogin yes
# 限制用户登录
AllowUsers username1 username2
DenyUsers baduser
# 设置最大尝试次数
MaxAuthTries 3
配置生效#
# 检查配置语法
sudo sshd -t
# 重新加载配置(不中断现有连接)
sudo systemctl reload ssh
# 或完全重启服务
sudo systemctl restart ssh
🖥️ X11 图形界面转发#
服务器端配置#
# 1. 安装必要的图形包
sudo apt update
sudo apt install -y xauth xorg openbox
# 2. 确保 SSH 配置支持 X11
# 编辑 /etc/ssh/sshd_config:
X11Forwarding yes
X11UseLocalhost no
# 3. 重启 SSH 服务
sudo systemctl restart ssh
客户端连接#
常见问题解决#
📁 文件传输#
SCP(安全复制)#
使用示例:
# 本地 → 远程
scp -P 2222 ./file.txt user@server_ip:/remote/path/
scp -r ./local_dir/ user@server_ip:/remote/path/
# 远程 → 本地
scp user@server_ip:/remote/file.txt ./
scp -r user@server_ip:/remote/dir/ ./local_dir/
# 使用大括号复制多个文件
scp user@server_ip:/path/{file1.txt,file2.txt} ./
# 保持文件属性
scp -p file.txt user@server_ip:/remote/
SFTP(安全文件传输)#
# 连接 SFTP
sftp -P 2222 user@server_ip
# 常用命令
ls # 列出远程文件
lls # 列出本地文件
cd /remote/path # 切换远程目录
lcd /local/path # 切换本地目录
put local_file # 上传文件
get remote_file # 下载文件
mkdir new_dir # 创建远程目录
rm file # 删除远程文件
exit # 退出
🔄 端口转发#
本地端口转发 (-L)#
将远程服务器的端口转发到本地机器。用于访问远程内网服务。
场景:访问远程服务器或其内网中的服务
# 语法:ssh -L [本地 IP:]本地端口:远程目标主机:远程目标端口 SSH 服务器
# 流量方向:本地端口 → SSH 隧道 → 远程目标主机
# 示例 1:访问远程内网的 Web 服务
ssh -L 8080:192.168.1.100:80 user@jump_server
# 访问方式:本地浏览器打开 http://localhost:8080
# 流量:本地 8080 → jump_server → 192.168.1.100:80
# 示例 2:转发到 SSH 服务器本机的服务
ssh -L 3306:localhost:3306 user@database_server
# localhost 指 database_server 服务器上的 localhost
# 访问方式:本地 mysql 客户端连接 localhost:3306
# 示例 3:后台运行,不执行远程命令
ssh -N -f -L 3306:localhost:3306 user@database_server
# 示例 4:绑定到本地所有网络接口(允许其他机器访问本地端口)
ssh -L 0.0.0.0:8080:localhost:80 user@server
远程端口转发 (-R)#
将本地机器的服务端口转发到远程 SSH 服务器。用于让远程机器访问本地服务。
场景:本地开发的服务临时暴露给远程服务器访问
# 语法:ssh -R [远程 IP:]远程端口:本地主机:本地端口 SSH 服务器
# 流量方向:远程端口 → SSH 隧道 → 本地服务
# 示例 1:把本地 SSH 服务转发到远程服务器
ssh -R 2222:localhost:22 user@remote_server
# 其他机器可通过 remote_server:2222 访问本地机器的 SSH
# 示例 2:把本地 Web 服务转发到远程服务器
ssh -R 8080:127.0.0.1:8080 root@172.18.122.71
# 远程服务器可通过 localhost:8080 访问本地机器的 8080 服务
# 示例 3:绑定到远程服务器的所有接口(允许其他机器访问远程端口)
ssh -R 0.0.0.0:8080:127.0.0.1:8080 root@172.18.122.71
# 其他机器可通过 172.18.122.71:8080 访问本地机器的 8080 服务
配置远程服务器 GatewayPorts:
# 在远程 SSH 服务器(172.18.122.71)上配置
sudo vim /etc/ssh/sshd_config
# 添加或修改:
GatewayPorts yes # 允许远程端口转发绑定到所有接口
AllowTcpForwarding yes # 允许 TCP 转发(默认启用)
# 重启 sshd
sudo systemctl restart sshd
💡 注意:默认情况下
-R只绑定到远程服务器的localhost,需要GatewayPorts yes才能绑定到0.0.0.0。
转发对比表#
| 选项 | 方向 | 用途 | 示例 |
|---|---|---|---|
-L |
本地 ← 远程 | 访问远程内网服务 | 访问远程数据库 |
-R |
远程 ← 本地 | 暴露本地服务给远程 | 本地开发调试 |
-D |
SOCKS 代理 | 访问远程整个内网 | 代理上网 |
服务器配置:
# 编辑 /etc/ssh/sshd_config
ClientAliveInterval 600 # 每600秒发送一次心跳
ClientAliveCountMax 10 # 最多10次无响应后断开
# 重启服务
sudo systemctl restart ssh
🔄 文件夹同步(rsync)#
- 更好的的方法使用 vscode
remote ssh插件;
基本语法#
常用选项#
| 选项 | 功能说明 |
|---|---|
-a |
归档模式(保留权限、时间等) |
-v |
显示详细传输信息 |
-z |
压缩传输数据 |
-r |
递归处理目录 |
-P |
显示进度,支持断点续传 |
--delete |
删除目标多余文件 |
--exclude |
排除指定文件/目录 |
-e |
指定远程shell(如SSH) |
实用示例#
# 本地同步
rsync -avz /source/dir/ /backup/dir/
# 远程同步(推送到服务器)
rsync -avz -e "ssh -p 2222" ./local_dir/ user@server:/remote/dir/
# 远程同步(从服务器拉取)
rsync -avz -e "ssh -p 2222" user@server:/remote/dir/ ./local_dir/
# 排除特定文件
rsync -avz --exclude='*.tmp' --exclude='logs/' ./src/ user@server:/dest/
# 删除目标多余文件(保持完全一致)
rsync -avz --delete ./src/ user@server:/dest/
# 使用大括号同步多个目录
rsync -avz user@server:/path/{dir1,dir3,file.txt} ./
增量备份脚本示例#
#!/bin/bash
SOURCE="/data/important/"
BACKUP_SERVER="user@backup.server.com"
BACKUP_PATH="/backup/data/"
# 每日增量备份
rsync -avz --delete \
--link-dest=../previous \
-e "ssh -i /home/user/.ssh/backup_key" \
"$SOURCE" \
"$BACKUP_SERVER:$BACKUP_PATH/$(date +%Y%m%d)/"