我正在尝试在 Debian Jessie 机器启动时运行一个脚本,其中包括创建一个 SSH 反向隧道。
问题是,我已将此脚本放在 中,if-up
并将其放入rc.local
启动器中。所有其他作业都运行正常,但当它必须创建 SSH 隧道时,它要么无法创建它,要么它会在作业正在运行消息上挂起启动。
我会更清楚,但问题是,如果我/etc/rc.local
在机器启动后运行,隧道就会完美运行。
我必须补充一点,创建隧道的机器是 Raspberry Pi,有时我无法 ssh,直到我进行一些 ping。我管理脚本以便这样做,但在启动时没有成功。
正如你所看到的,我根本没有经验,只是在学习。
编辑:谢谢。正如我之前所说,如果我从控制台启动代码,代码运行完美。我给它完整的权限(777)给每个人,以防万一和测试。脚本已启用执行,但只有一个 chmod +x,也许还需要其他东西……这是代码。正如我所说,远程机器中的脚本要求提供私有和公共 IP 并将其放入 rpi 数据库中,之后他启动反向隧道(或不启动)从 /etc/rc.local 启动它,脚本存储在 /usr/local/games
#!/bin/bash
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
publica=$(curl http://ipecho.net/plain)
sleep 0.25s
privada1= while IFS=$': \t' read -a line ;do
[ -z "${line%inet}" ] && ip=${line[${#line[1]}>4?1:2]} &&
[ "${ip#127.0.0.1}" ] && privada1=$ip
done< <(LANG=C /sbin/ifconfig)
fecha=$(date +%F_%X)
sleep 0.15
nombre=$(hostname)
sleep 0.15s
curl --data "nombre=$nombre&fecha=$fecha&publica=$publica&privada1=$privada1&privada2=$privada2&privada3=$privada3&privada4=$privada4&press=envia" http://www.xxxxxxxxx.xx/xxx.php
while [[ $(autossh -p xxxx -R 10101:localhost:22 [email protected] -fN) -ne 0 ]]; do
ping -c3 xxxxxxxxx.xx
if ($? -eq 0) then
autossh -p xxxx -R 10101:localhost:22 [email protected] -fN;
else
ping -c3 xxxxxx.xxx
fi
done
else bash -x /etc/rc.local
fi
exit 0
答案1
尝试这个脚本:
#!/bin/bash
remote_host=rpi.local
remote_port=10022
local_port=22
cmd="ssh -fN -R ${remote_port}:localhost:${local_port} ${remote_host}"
while true; do
pgrep -fx "$cmd" >/dev/null 2>&1 || $cmd
sleep 10
done
笔记:
根据需要调整远程主机和端口。
该脚本以 形式构建完整的
ssh
命令行cmd
。该脚本反复(每 10 秒)检查是否存在执行该精确命令行的进程,如果不存在,则启动一个进程。
将
ssh
在后台运行,因为-f
。从 调用脚本
/etc/rc.local
。要终止隧道,请先终止脚本,然后终止
ssh
进程。不用说,您需要无密码密钥才能实现此功能。
答案2
好吧,对于那些在这一点上遇到困难的人来说。感谢一位朋友,他给了我线索。rc.local 以 root 身份启动脚本。因此,启动 ssh 隧道的命令(在我的情况下是 autossh)必须以其他用户身份启动。
使用 sudo -u "youruser" 即可。
感谢所有人。