反向ssh隧道

时间:2012-05-31 18:16:42

标签: linux ssh cron tunnel

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

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

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

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

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

5 个答案:

答案 0 :(得分:2)

我写了跟随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

答案 1 :(得分:1)

使用autossh,如果断开连接将重新建立连接。如果找不到,请先尝试在您的发行版回购中搜索,然后再在网上搜索。

答案 2 :(得分:1)

我编写了以下脚本,cron每5分钟运行一次。 虽然我希望这可以工作,但我仍然发现连接不允许我一直从远端进入。 要回答上面的评论 - 它似乎没有从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

希望有人发现以上内容有用,并且可以让我知道在哪里建立更多支票。

答案 3 :(得分:0)

启动新进程后,只需终止上一个进程(按ID)。您可以从ps命令获取进程ID。

答案 4 :(得分:0)

您可以使用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

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