【问题标题】:Exit an SSH Tunnel without closing it退出 SSH 隧道而不关闭它
【发布时间】:2016-01-05 20:37:38
【问题描述】:

我正在尝试编写一个脚本来设置一堆端口转发。这部分工作正常,我遇到的麻烦是弄清楚如何建立一个 SSH 隧道,然后(基本上)将它从我的本地分离而不关闭隧道?

#!/bin/bash


# Text (Foreground) Colors
norm_text='\e[0m'
black_text='\e[30m'
red_text='\e[31m'
green_text='\e[32m'
yellow_text='\e[33m'
blue_text='\e[34m'
magenta_text='\e[35m'
cyan_text='\e[36m'
lgray_text='\e[37m'
dgray_text='\e[90m'
lred_text='\e[91m'
lgreen_text='\e[92m'
lyellow_text='\e[93m'
lblue_text='\e[94m'
lmagenta_text='\e[95m'
lcyan_text='\e[96m'
white_text='\e[97m'

# Text (Background) Colors
norm_back='\e[49m'
black_back='\e[40m'
red_back='\e[41m'
green_back='\e[42m'
yellow_back='\e[43m'
blue_back='\e[44m'
magenta_back='\e[45m'
cyan_back='\e[46m'
lgray_back='\e[47m'
dgray_back='\e[100m'
lred_back='\e[101m'
lgreen_back='\e[102m'
lyellow_back='\e[103m'
lblue_back='\e[104m'
lmagenta_back='\e[105m'
lcyan_back='\e[106m'
white_back='\e[107m'
#-------------------------------

function menu() {
echo -e "\t==============="
echo -e "\t${yellow_text}Port Forwarding${norm_text}"
echo -e "\t==============="
echo -e "${green_text}"
echo -e "1.) Start Port Forwarding"
echo -e "2.) Stop Port Forwarding"
echo -e "${norm_text}"
echo -e "${red_text}5.) Exit${norm_text}"
echo -e ""
echo -en "Please enter an option: "
}
menu
read -n1 OPTION
case "$OPTION" in
    "1")
        echo -e ""
        echo -e ""
        read -p "What is your  z-id?" USER
        USER="$USER"
        ssh -N -L 6111:remote.server.org:8080 -L 6112:remote.server.org:8080 -L 6121:remote.server.org:8080 -L 6122:remote.server.org:8080 -L 6211:remote.server.org:8080 -L 6212:remote.server.org:8080 -L 6214:remote.server.org:8080 -L 6215:remote.server.org:8080 -L 6221:remote.server.org:8080 -L 6222:remote.server.org:8080 -L 6224:remote.server.org:8080 -L 6225:remote.server.org:8080 -L 6311:remote.server.org:8080 -L 6312:remote.server.org:8080 -L 6314:remote.server.org:8080 -L 6315:remote.server.org:8080 -L 6321:remote.server.org:8080 -L 6322:remote.server.org:8080 -L 6324:remote.server.org:8080 -L 6325:remote.server.org:8080 -L 6411:remote.server.org:8080 -L 6412:remote.server.org:8080 -L 6421:remote.server.org:8080 -L 6422:remote.server.org:8080 -L 7111:remote.server.org:8080 -L 7112:remote.server.org:8080 -L 7113:remote.server.org:8080 -L 7121:remote.server.org:8080 -L 7122:remote.server.org:8080 -L 7123:remote.server.org:8080 -L 7211:remote.server.org:8080 -L 7212:remote.server.org:8080 -L 7213:remote.server.org:8080 -L 7221:remote.server.org:8080 -L 7222:remote.server.org:8080 -L 7223:remote.server.org:8080 -L 7311:remote.server.org:8080 -L 7312:remote.server.org:8080 -L 7313:remote.server.org:8080 -L 7321:remote.server.org:8080 -L 7322:remote.server.org:8080 -L 7323:remote.server.org:8080 -L 7411:remote.server.org:8080 -L 7412:remote.server.org:8080 -L 7413:remote.server.org:8080 -L 7421:remote.server.org:8080 -L 7422:remote.server.org:8080 -L 7423:remote.server.org:8080 -L 7511:remote.server.org:8080 -L 7512:remote.server.org:8080 -L 7513:remote.server.org:8080 -L 7521:remote.server.org:8080 -L 7522:remote.server.org:8080 -L 7523:remote.server.org:8080 -L 7611:remote.server.org:8080 -L 7612:remote.server.org:8080 -L 7613:remote.server.org:8080 -L 7621:remote.server.org:8080 -L 7622:remote.server.org:8080 -L 7623:remote.server.org:8080 -L 8111:remote.server.org:7034 -L 8121:remote.server.org:7034 -L 8211:remote.server.org:7034 -L 8221:remote.server.org:7034 -L 8311:remote.server.org:7034 -L 8314:remote.server.org:7034 -L 8321:remote.server.org:7034 -L 8324:remote.server.org:7034 -L 8411:remote.server.org:7034 -L 8421:remote.server.org:7034 "${USER}"@tunnel.server.org
        echo -e ""
        echo -e "Local Port 6111 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6112 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6121 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6122 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6211 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6212 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6214 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6215 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6221 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6222 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6224 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6225 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6311 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6312 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6314 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6315 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6321 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6322 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6324 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6325 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6411 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6412 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6421 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 6422 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7111 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7112 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7113 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7121 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7122 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7123 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7211 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7212 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7213 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7221 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7222 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7223 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7311 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7312 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7313 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7321 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7322 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7323 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7411 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7412 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7413 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7421 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7422 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7423 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7511 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7512 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7513 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7521 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7522 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7523 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7611 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7612 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7613 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7621 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7622 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 7623 is now resolving content from \"remote.server.org:8080\""
        echo -e "Local Port 8111 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8111 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8121 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8211 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8221 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8311 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8314 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8321 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8324 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8411 is now resolving content from \"remote.server.org:7034\""
        echo -e "Local Port 8421 is now resolving content from \"remote.server.org:7034\""
        echo -e ""
        echo -e "Port Forwarding ${red_back}${yellow_text}Active${norm_text}${norm_back}:"
    ;;
esac

到目前为止,它会提示您输入密码,并且端口转发隧道运行良好,但我的脚本挂起......我想要一个交互式菜单,如“关闭隧道”等。

我知道我现在有“-N”选项,即“不执行命令”...我已将其删除并尝试了一些简单的方法,例如

remote.server.org:7034 -L 8421:remote.server.org:7034  "${USER}"@tunnel.server.org "sleep 10 &"

暂停然后后台作业,但那是在远程系统上将其后台化,而不是在这里......但无论如何它会立即崩溃。

我研究了一堆,发现“-S -O”......虽然我已经阅读了 SSH 的 MAN 页面,但我仍然没有牢牢掌握如何正确实施它,或者如果那是甚至是我真正想要的。

我希望这是有道理的。非常感谢您的帮助!

【问题讨论】:

  • 如果你能设法使用ssh keys,你可以在后台运行ssh命令ssh otheroptionshere &,然后是PIDOF=$!。然后在停止时您可以kill $PIDOF。如果您需要使用密码,请使用-f
  • 您可以在后台运行它并分离,类似( ( command ) & ) & 应该可以工作。

标签: bash ssh tunnel


【解决方案1】:

典型的用例是将-NTf 开关添加到您的命令中。来自ssh 的手册页:

-f 在命令执行之前请求 ssh 进入后台。 [...]

-N 不要执行远程命令。这对于仅转发端口很有用(仅限协议版本 2)。

-T 禁用伪 tty 分配。

【讨论】:

  • 我也读过那些......你能提供一个工作用例场景吗? “-f”将SSH命令发送到本地后台(我认为),“-N”应该是因为我只是转发端口......我不熟悉什么“-T”和“伪- tty”是或确实。感谢您的澄清。
  • 现在更好的记忆方式是 -NfT :)
猜你喜欢
  • 2017-12-07
  • 2017-12-22
  • 2011-05-23
  • 2012-03-15
  • 2011-12-06
  • 2013-03-24
  • 1970-01-01
  • 2013-05-15
  • 2010-12-13
相关资源
最近更新 更多