Skip to content

SSH 使用#

参考文档:ssh


安装与启动#

Ubuntu/Debian 系统#

# 安装 OpenSSH 服务器
sudo apt update
sudo apt install openssh-server sshd

# 验证安装
ssh -V

服务管理#

# 启动 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

使用密钥连接#

# 指定密钥文件连接
ssh -i ~/.ssh/my_key user@server_ip

# 指定端口连接
ssh -i ~/.ssh/id_rsa -p 2222 user@server_ip

⚙️ 服务器配置#

配置文件位置#

# SSH 服务端配置文件
/etc/ssh/sshd_config

# SSH 客户端配置文件
/etc/ssh/ssh_config
~/.ssh/config

常用配置选项#

# 修改监听端口(默认 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

客户端连接#

# 启用 X11 转发连接
ssh -X user@server_ip

xeyes
firefox

常见问题解决#

# 修复权限问题
chmod 600 ~/.Xauthority

# sudo 运行 不起作用
sudo cp ~/.Xauthority /root/.Xauthority

📁 文件传输#

SCP(安全复制)#

# 基本语法
scp [选项] 源文件 目标路径

# 常用选项
-P 端口号    # 指定端口(注意是大写 P)
-r          # 递归复制目录
-C          # 启用压缩传输
-v          # 显示详细信息

使用示例:

# 本地 → 远程
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 插件;

基本语法#

rsync [选项] 源路径 目标路径

常用选项#

选项 功能说明
-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)/"