繁体   English   中英

反向ssh隧道

[英]reverse ssh tunnel

我有一个嵌入式设备,通过USB细胞棒连接到互联网。 为了能够到达它,我在端口19996上建立一个反向ssh隧道到我的家用PC以便能够访问它。

现在我每10分钟(通过cron)重新建立一个隧道,以确保我有几乎不间断的访问,即使提供商决定更改我的IP。

现在我意识到我的进程列表已经满了

"4383 root     ssh -R 19996:localhost:22 -f -N user@host"

和netstat也加载了连接。 我怎样才能确保不会发生这种情况? 我一次只需要一个隧道,而不是100个隧道。

我写了跟随shell脚本,似乎工作正常!

#!/bin/sh
RETVAL=`netstat | grep 'S0106b0487afe2a57'| grep -c 'ssh ESTABLISHED'`
echo "${RETVAL} open tunnel(s)"
if [ "$RETVAL" -lt "1" ]
  then
        echo "starting reverse ssh tunnel"
        `ssh -R 19999:localhost:22 -f -N user@host`
        echo "done"
fi

使用autossh,如果断开连接将重新建立连接。 如果你找不到它,首先尝试在你的发行版的repo中搜索,然后在网上搜索。

我编写了以下脚本,每隔5分钟就会运行一次cron。 虽然我希望这可以工作,但我仍然发现连接不允许我一直从远端进入。 要回答上面的评论 - 它似乎没有从netstat中消失。 我检查netstat,它仍然会为连接说“ssh ESTABLISHED”,所以当我的脚本运行时,我得到“套接字似乎连接的结果。假设反向ssh隧道运行良好。” 必须有一个更好的方法来测试远程端并得到一个结果,表明它的工作?

#!/bin/bash

#$Id: ssh_reverse_tunnel.sh 14 2012-10-13 22:53:21Z root $

REMOTE_USER="user"
REMOTE_DOMAIN="domain"
SOCKETS_USED=`netstat -p ssh | grep 'ssh ESTABLISHED' | grep -c $(host $REMOTE_DOMAIN | awk {'print $NF'})`

establish_connecton() {
  echo "establishing reverse ssh tunnel connection..."
  ssh -R 12222:localhost:22 -R12223:localhost:5901 -f -N -T ${REMOTE_USER}@${REMOTE_DOMAIN} &
  echo "done."
  echo
  exit
}

if [ $(ps -ef | grep "ssh -R 12222" | grep -v grep | wc -l) == 0 ]; then
  echo "no reverse ssh tunnel connection exists."
  establish_connecton
fi

if [ "$SOCKETS_USED" -lt 1 ]; then
  echo "no reverse ssh tunnel sockets are connected. nuking stale pids and re-establishing connection"
  # check for stale pids and kill them if found.
  if [ $(ps -ef | grep "ssh -R 12222" | grep -v grep | wc -l) -gt 0 ]; then
    # stale pids exist, kill them...
    ps -ef | grep "ssh -R 12222" | grep -v grep | awk {'print $2'} | \
      while read PID; do
        echo "kill -9 $PID"
      done
  fi
  establish_connecton
else
  echo "sockets appear connected. assuming reverse ssh tunnel is running fine."
fi

希望有人发现上述有用,并可以让我知道在哪里建立更多的检查。

在启动新进程后,只需杀死上一个进程(通过ID)。 您可以从ps命令获取进程ID。

您可以使用ssh命令套接字检查连接是否仍处于活动状态。 它应该如下所示:

#!/bin/bash
if ! ssh -S mysocket -O check user@host ; then
    ssh -M -S mysocket -R 19996:localhost:22 -f -N user@host
fi

然后,您可以使用关闭该特定连接

ssh -S mysocket -O exit user@host

使用-o ServerAliveInterval=NServerAliveInterval设置为大于0的值也可能是值得的。 因为如果连接丢失,它会杀死你的隧道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM