我有以下问题:
我有一台可通过 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
关闭服务器、连接和隧道。
到目前为止,一切都很好。
问题是:是否可以编写一个脚本来组合所有内容,以便在浏览器终止时关闭隧道?
更准确地说,我想要一个脚本:
- 打开隧道并启动远程服务器(如上所述)。
- 自动在正确的端口(可以随机生成)上打开浏览器(firefox 可以,但不是必须的)。
- 在浏览器运行时保持隧道运行。
- 当浏览器终止时(我知道可能还有其他打开的窗口,但这超出了重点),它应该
SIGHUP
向服务器()发送一个信号()start.sh
。 - 当远程服务器终止时,隧道应关闭(通过上述设置,这应该是自动的)
我想保留隧道和服务器在严格需要的时间内启动并运行,避免“忘记关闭”,因为如果我必须手动执行此操作,则可能会发生这种情况。
我怎样才能做到这一点?
答案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 投了赞成票,因为它激发了这个想法。