开通临时隧道

开通临时隧道

我有以下问题:

我有一台可通过 ssh 访问的远程计算机,它可以通过 Web 界面提供一些数据。

我可以使用 OpenSSH LocalForwarding 打开隧道并启动远程服务器:

ssh [email protected] -L 127.0.0.1:3333:localhost:4000 ./start.sh

然后,在另一个终端(或从 GUI)上,我可以启动浏览器,例如:

firefox localhost:3333/whatever

并访问我的应用程序提供的内容。

使用后,我只需输入 [CTRL-C] 即可start.sh关闭服务器、连接和隧道。

到目前为止,一切都很好。

问题是:是否可以编写一个脚本来组合所有内容,以便在浏览器终止时关闭隧道?

更准确地说,我想要一个脚本:

  1. 打开隧道并启动远程服务器(如上所述)。
  2. 自动在正确的端口(可以随机生成)上打开浏览器(firefox 可以,但不是必须的)。
  3. 在浏览器运行时保持隧道运行。
  4. 当浏览器终止时(我知道可能还有其他打开的窗口,但这超出了重点),它应该SIGHUP向服务器()发送一个信号() start.sh
  5. 当远程服务器终止时,隧道应关闭(通过上述设置,这应该是自动的)

我想保留隧道服务器在严格需要的时间内启动并运行,避免“忘记关闭”,因为如果我必须手动执行此操作,则可能会发生这种情况。

我怎样才能做到这一点?

答案1

您似乎已经概述了问题中的大部分步骤。这几乎就是您所要求的:

#!/bin/sh

# start ssh in the background, and record the pid in $ssh_pid.
ssh -n -L 127.0.0.1:3333:localhost:4000 [email protected] ./start.sh &
ssh_pid=$!

# start firefox. we're not running it in the background, so the
# script blocks here until firefox terminates.
firefox localhost:3333/whatever

# kill the ssh process
kill $ssh_pid

当远程服务器终止时,隧道应关闭(通过上述设置,这应该是自动的)

如果远程./start.sh命令终止,则将ssh退出。在这种情况下,此脚本不会退出 Firefox,但隧道将不再存在。

答案2

事实证明答案比预期的要复杂一些。

我最终为服务器编写了完整的初始化脚本:

#!/bin/sh

# use start-stop-daemon to control zero-ui
set -e

# Must be a valid filename
NAME=zero-ui
PIDFILE=/home/user/$NAME.pid
DAEMON=/usr/bin/node
DAEMON_OPTS="/home/user/zero-ui/backend/bin/www"

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"

export NODE_ENV=production
export ZU_SECURE_HEADERS=false
export ZU_SERVE_FRONTEND=true
export ZU_CONTROLLER_TOKEN=...
export ZU_DISABLE_AUTH=true
export ZU_DEFAULT_USERNAME=...
export ZU_DEFAULT_PASSWORD=...

case "$1" in
  start)
        echo -n "Starting daemon: "$NAME
    start-stop-daemon --start --quiet --pidfile $PIDFILE -m --exec $DAEMON --chdir /home/user/zero-ui/backend -- $DAEMON_OPTS
        echo "."
    ;;
  stop)
        echo -n "Stopping daemon: "$NAME
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
        echo "."
    ;;

  *)
    echo "Usage: "$1" {start|stop}"
    exit 1
esac

exit 0

然后我用以下脚本调用它:

#!/bin/sh
set -e

ssh -n -L 127.0.0.1:3333:localhost:4000 user@server ./start-stop-zeroui start &
firefox localhost:3333/app
ssh user@server ./start-stop-zeroui stop
fg

如果@larsks 或其他任何人提出更好的答案,我会很乐意接受他们的答案,否则几天后我会接受我自己的答案。

我对@larsks 投了赞成票,因为它激发了这个想法。

相关内容