3

私は、USBセルスティックを介してインターネットに接続された組み込みデバイスをフィールドに置いています。そこに到達できるようにするために、ポート19996に自宅のPCへの逆SSHトンネルを確立してアクセスできるようにします。

ここで、プロバイダーがIPを変更することを決定した場合でも、アクセスがほとんど中断されないようにするために、10分ごとに(cronによって)そのトンネルを再確立します。

今、私は自分のプロセスリストがいっぱいであることに気づきました

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

また、netstatには接続もロードされます。これが起こらないようにするにはどうすればよいですか?一度に開く必要があるトンネルは1つだけで、数百のトンネルは必要ありません。

4

5 に答える 5

2

うまくいくように見えるfollowiungシェルスクリプトを書きました!

#!/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 に答える