3

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

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

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

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

并且 netstat 也加载了连接。我如何确保不会发生这种情况?我一次只需要打开一条隧道,而不是 100 条。

4

5 回答 5

2

我写了followiung shell script,它似乎工作正常!

#!/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
于 2012-05-31T21:01:26.580 回答
1

使用 autossh 代替,如果它断开连接,它将重新建立连接。如果找不到,请尝试先在发行版的存储库中搜索,然后在网上搜索。

于 2012-05-31T18:19:21.963 回答
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

希望有人发现上述内容有用,并可以让我知道在哪里进行更多检查。

于 2012-10-14T15:59:09.870 回答
0

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

于 2012-05-31T18:20:18.580 回答
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将 设置为大于 0 的值也可能是值得的-o ServerAliveInterval=N。因为如果连接丢失,它会杀死你的隧道。

于 2013-08-28T14:44:39.013 回答