web-dev-qa-db-ja.com

ssh:トンネルが生きているかどうかを確認します

小さなbashスクリプト を記述しましたが、これにはリモートサーバーからデータを引き出すためにsshトンネルが必要なので、ユーザーにプロンプ​​トを表示します。

echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"

ユーザーがこのトンネルを開いたかどうかを確認し、トンネルが存在しない場合はエラーメッセージで終了します。 sshトンネルを照会する方法はありますか?つまり、ローカルポート6000が実際にそのサーバーにトンネルされているかどうかを確認しますか?

34
Adam Matan

これは私のテストです。役に立てば幸いです。

# $COMMAND is the command used to create the reverse ssh tunnel
COMMAND="ssh -p $SSH_PORT -q -N -R $REMOTE_Host:$REMOTE_HTTP_PORT:localhost:80 $USER_NAME@$REMOTE_Host"

# Is the tunnel up? Perform two tests:

# 1. Check for relevant process ($COMMAND)
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND

# 2. Test tunnel by looking at "netstat" output on $REMOTE_Host
ssh -p $SSH_PORT $USER_NAME@$REMOTE_Host netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \
   > /dev/null 2>&1
if [ $? -ne 0 ] ; then
   pkill -f -x "$COMMAND"
   $COMMAND
fi
29
Tommy

Netcatはあなたの友達です:

nc -z localhost 6000 || echo 'no tunnel open'; exit 1
43
rxw

Autosshが最適なオプションです-すべてのケースでチェックプロセスが機能していません(ゾンビプロセス、ネットワーク関連の問題など)

例:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 Host2
18
Jeff

これは実際にはサーバー障害タイプの質問ですが、netstatを使用することもできます。

何かのようなもの:

 # netstat -lpnt | grep 6000 | grep ssh

これにより、指定されたポートでリッスンしているsshプロセスがあるかどうかがわかります。また、プロセスのPIDも通知します。

正しいオプションでsshプロセスが開始されたことを本当に確認したい場合は、次のようなPIDでプロセスを検索できます。

# ps aux | grep PID
10
Igor Serebryany

autossh を使用します。 ssh接続を監視するためのツールです。

7
plaes

Psコマンドを使用して確認できます

# ps -aux | grep ssh

実行中のすべてのshhサービスが表示され、トンネルサービスが一覧表示されます

1
Javeed Shakeel

stunnelは、ホスト間を半永久的に接続するための優れたツールです。

http://www.stunnel.org/

これらは、SSHトンネルをテストまたはトラブルシューティングするためのより詳細な手順です。それらの一部をスクリプトで使用できます。 2つのアプリケーションが動作を停止した後、それらの間のリンクのトラブルシューティングを行う必要があるため、この回答を追加しています。 sshプロセスをただgrepするだけでは十分ではありませんでした。そして、nc -zを使用できませんでした。なぜなら、このオプションはnetcatの呪文では使用できなかったからです。

最初から始めましょう。 IPアドレス10.0.0.1でlocalと呼ばれるマシンがあり、remote、10.0.3.12以下のコマンドにこれらのホスト名を追加するので、どこで実行されているかは明らかです。

目標は、ポート123のリモートマシンのループバックアドレスからポート456のローカルマシンにTCPトラフィックを転送するトンネルを作成することです。これは、次のコマンドで実行できます。ローカルマシン:

local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12

プロセスが実行されていることを確認するには、次のようにします。

local:~# ps aux | grep ssh

出力にコマンドが表示されたら、先に進むことができます。そうでない場合は、SSHキーがリモートにインストールされていることを確認してください。リモートIPの前のユーザー名を除外すると、sshが現在のユーザー名を使用することに注意してください。

次に、リモートでトンネルが開いていることを確認します。

remote:~# netstat | grep 10.0.0.1

次のような出力が得られます。

tcp  0  0  10.0.3.12:ssh  10.0.0.1:45988  ESTABLISHED

実際にがいいのは、リモートからホストに送信されるデータの一部を参照してください。これがnetcatの出番です。CentOSでは、yum install ncでインストールできます。

まず、ローカルマシンのリスニングポートを開きます。

local:~# nc -l 127.0.0.1:456

次に、リモートで接続します。

remote:~# nc 127.0.0.1 123

ローカルマシンへの2番目のターミナルを開くと、接続を確認できます。このようなもの:

local:~# netstat | grep 456
tcp  0  0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED
tcp  0  0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED

さらに良いことに、リモートで何かを入力してください:

remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?

これは、ローカル端末でミラーリングされていることがわかります。

local:~# nc -l 127.0.0.1:456
Hallo?
anyone there?

トンネルは機能しています!しかし、appnameと呼ばれるアプリケーションがあり、ローカルマシンのポート456でリッスンすることになっている場合はどうでしょうか?両側でncを終了してから、アプリケーションを実行します。 correctポートでリッスンしていることを確認するには、 this を使用します。

local:~# netstat -tulpn | grep LISTEN | grep appname
tcp  0  0  127.0.0.1:456  0.0.0.0:* LISTEN  2964/appname

ところで、リモートで同じコマンドを実行すると、ポート127.0.0.1:123でリッスンするsshdが表示されます。

1
Nagev

バックグラウンドでsshを使用している場合、これを使用します。

Sudo lsof -i -n | egrep '\<ssh\>'
0
Alex Montoya
#!/bin/bash

# Check do we have tunnel to example.com server
lsof -i tcp@localhost:6000 > /dev/null

# If exit code wasn't 0 then tunnel doesn't exist.
if [ $? -eq 1 ]
then
  echo ' > You missing ssh tunnel. Creating one..'
  ssh -L 6000:localhost:5432 example.com
fi

echo ' > DO YOUR STUFF < '
0
sobi3ch