SSH 隧道进程如何放入后台运行且关闭终端不中断?

文章导读
最稳妥的方案是使用 autossh 配合 systemd 管理,适合需要长期稳定的端口转发场景;如果是临时调试,screen 或 tmux 更灵活。
📋 目录
  1. 环境准备与安装
  2. 命令速用版
  3. Systemd 开机自启配置
  4. 验证方法
  5. 常见坑与排查
A A

最稳妥的方案是使用 autossh 配合 systemd 管理,适合需要长期稳定的端口转发场景;如果是临时调试,screen 或 tmux 更灵活。

先说结论:单纯依赖 ssh 命令后台参数不够稳定,生产环境建议用进程守护工具。

  • 适合:需要长期保持的本地端口转发或远程映射
  • 先准备:配置 SSH 密钥免密登录并测试连通性
  • 验收:关闭终端后检查进程存活及端口监听状态

环境准备与安装

1. 安装 autossh(推荐)

Debian/Ubuntu 系统:

sudo apt-get update
sudo apt-get install autossh

CentOS/RHEL 系统:

sudo yum install autossh

2. 生成并配置密钥

ssh-keygen -t ed25519
ssh-copy-id 用户@主机

3. 修正私钥权限(关键步骤)

权限过高会导致 SSH 拒绝使用密钥,必须执行:

chmod 600 ~/.ssh/id_ed25519

4. 前台测试连通性

在后台运行前,先在前台测试隧道是否通畅,避免后台静默失败:

ssh -N -v -L 本地端口:目标主机:目标端口 用户@主机

确认连接成功且无报错后,按 Ctrl+C 退出。

命令速用版

1. 临时后台运行(原生 ssh)

ssh -f -N -o "ExitOnForwardFailure=yes" -L 本地端口:目标主机:目标端口 用户@主机

注意:添加 -o "ExitOnForwardFailure=yes" 可防止端口转发失败时进程仍驻留后台。

2. 稳定守护运行(autossh)

autossh -M 0 -f -N -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 本地端口:目标主机:目标端口 用户@主机

参数说明:-M 0 禁用监控端口,依赖 SSH 心跳检测;ServerAliveInterval 设置心跳间隔。

Systemd 开机自启配置

若需开机自动启动隧道,建议创建 systemd 服务文件。

SSH 隧道进程如何放入后台运行且关闭终端不中断?

1. 创建服务文件

sudo vim /etc/systemd/system/ssh-tunnel.service

2. 填入以下配置内容

[Unit]
Description=SSH Tunnel Service
After=network.target

[Service]
User=你的用户名
ExecStart=/usr/bin/autossh -M 0 -o "ExitOnForwardFailure=yes" -N -L 本地端口:目标主机:目标端口 用户@主机
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

注意:请将“你的用户名”、端口及主机信息替换为实际值。

3. 启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable ssh-tunnel.service
sudo systemctl start ssh-tunnel.service

验证方法

1. 检查进程

ps -ef | grep ssh

2. 检查端口监听

ss -tlnp | grep 本地端口

3. 模拟终端关闭

退出当前 SSH 会话或关闭终端窗口,重新登录后再次执行上述检查命令,确认进程 PID 依然存在且端口仍在监听。

4. 查看服务状态(systemd 方式)

systemctl status ssh-tunnel.service

常见坑与排查

1. 密钥权限错误:私钥文件权限必须为 600,否则 SSH 会拒绝使用。执行 chmod 600 ~/.ssh/id_ed25519 修复。

2. 假成功后台化:未配置 ExitOnForwardFailure=yes 时,即使端口转发失败,进程也可能在后台运行。务必添加该参数。

3. 连接超时断开:默认 SSH 空闲超时可能切断连接,建议配置 ServerAliveInterval 保持心跳。

4. 端口冲突:确保本地监听端口未被其他程序占用,可使用 ss -tlnp 排查。

5. 僵尸进程:使用 -f 时若认证失败可能不会正确后台化,建议先前台测试成功再加 -f。