AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 704802
Accepted
ZioByte
ZioByte
Asked: 2022-06-03 13:39:56 +0800 CST2022-06-03 13:39:56 +0800 CST 2022-06-03 13:39:56 +0800 CST

开通临时隧道

  • 772

我有以下问题:

我有一台可以通过 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. 当远程服务器终止时隧道应该关闭(这应该是上述设置的自动)

我想在严格需要的时间内保持隧道和服务器的正常运行,避免“忘记关闭”,因为如果我必须手动执行它可能会发生。

我怎样才能做到这一点?

shell-script openssh
  • 2 2 个回答
  • 113 Views

2 个回答

  • Voted
  1. larsks
    2022-06-03T18:41:41+08:002022-06-03T18:41:41+08:00

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

    #!/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,但隧道将不再存在。

    • 1
  2. Best Answer
    ZioByte
    2022-06-04T10:11:16+08:002022-06-04T10:11:16+08:00

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

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

    #!/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,因为它激发了这个想法。

    • 0

相关问题

  • 在awk中的两行之间减去相同的列

  • 打印文件行及其长度的脚本[关闭]

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • MySQL Select with function IN () with bash array

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve