You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派(Raspbian)开机启动SSH隧道命令配置咨询

在Raspbian系统启动阶段自动建立SSH隧道的方案

嘿,我来帮你搞定这个问题~先给你吃个定心丸:rc.local并不是只在用户登录时生效,它是Raspberry Pi OS(原Raspbian)里传统的系统启动脚本,会在系统启动的最后阶段、任何用户登录之前就自动执行,完全符合你“无人登录服务器也能运行隧道”的需求。不过实际使用时有几个细节要注意,另外还有更可靠的systemd方案可以选,我都给你讲清楚。

方案一:用rc.local实现(快速上手)

1. 编辑rc.local文件

打开终端执行:

sudo nano /etc/rc.local

2. 添加你的SSH隧道命令

在文件末尾的exit 0之前加入你的隧道命令,注意这几点:

  • 必须用命令的绝对路径(因为rc.local的环境变量很有限,比如ssh的路径是/usr/bin/ssh,别直接写ssh
  • 命令结尾要加&让它在后台运行,不然会阻塞系统启动
  • 最好加上日志输出,方便后续排查问题

举个例子:

# 建立SSH隧道,把本地3306端口转发到远程数据库的3306端口
/usr/bin/ssh -f -N -L 3306:remote-db-ip:3306 user@remote-server-ip >> /var/log/ssh-tunnel.log 2>&1 &

参数解释:

  • -f:让SSH在后台运行
  • -N:不执行远程服务器的命令,只建立隧道
  • -L:本地端口转发规则,格式是本地端口:目标数据库地址:目标数据库端口

3. 确保rc.local有执行权限

如果文件没有执行权限,运行:

sudo chmod +x /etc/rc.local

4. 测试

手动运行一次脚本验证是否正常:

sudo /etc/rc.local

然后用netstat -tulpn | grep 3306检查隧道是否建立,或者查看日志cat /var/log/ssh-tunnel.log有没有报错。

方案二:用systemd服务(更可靠推荐)

虽然rc.local能用,但它有个小问题:如果系统网络还没完全就绪就执行SSH命令,可能会连接失败,而且隧道意外断开后不会自动重启。用systemd服务可以解决这些问题,还能更好地管理进程。

1. 创建systemd服务文件

执行:

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

写入以下内容(根据你的实际情况修改参数):

[Unit]
Description=Auto SSH Tunnel to Remote Database
After=network.target apache2.service
Wants=network.target

[Service]
User=root  # 用root权限足够建立隧道,也可以根据需求换其他用户
ExecStart=/usr/bin/ssh -N -L 3306:remote-db-ip:3306 user@remote-server-ip
Restart=always  # 隧道意外断开时自动重启
RestartSec=5  # 重启前等待5秒

[Install]
WantedBy=multi-user.target

2. 启用并启动服务

执行以下命令:

sudo systemctl daemon-reload
sudo systemctl enable ssh-tunnel.service  # 设置开机自启
sudo systemctl start ssh-tunnel.service   # 立即启动服务

3. 检查服务状态

执行:

sudo systemctl status ssh-tunnel.service

如果显示active (running)就说明正常运行了。后续查看日志可以用:

journalctl -u ssh-tunnel.service -f

关键注意事项

  • SSH免密登录:一定要配置树莓派到远程服务器的SSH密钥认证,不然隧道建立时会要求输入密码,无人值守下会失败。方法是在树莓派上执行ssh-keygen生成密钥,然后用ssh-copy-id user@remote-server-ip把公钥传到远程服务器。
  • 端口冲突:确保你用的本地端口(比如上面的3306)没有被树莓派上的其他服务占用。
  • 依赖顺序:不管用哪种方案,都要确保隧道在Apache启动之后(或者至少和网络服务同步),不然网站启动时隧道还没建立会连接数据库失败。

内容的提问来源于stack exchange,提问作者Ahmed Benjelloun

火山引擎 最新活动