小さなbashスクリプト を記述しましたが、これにはリモートサーバーからデータを引き出すためにsshトンネルが必要なので、ユーザーにプロンプトを表示します。
echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"
ユーザーがこのトンネルを開いたかどうかを確認し、トンネルが存在しない場合はエラーメッセージで終了します。 ssh
トンネルを照会する方法はありますか?つまり、ローカルポート6000が実際にそのサーバーにトンネルされているかどうかを確認しますか?
これは私のテストです。役に立てば幸いです。
# $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
Netcatはあなたの友達です:
nc -z localhost 6000 || echo 'no tunnel open'; exit 1
Autosshが最適なオプションです-すべてのケースでチェックプロセスが機能していません(ゾンビプロセス、ネットワーク関連の問題など)
例:
autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 Host2
これは実際にはサーバー障害タイプの質問ですが、netstatを使用することもできます。
何かのようなもの:
# netstat -lpnt | grep 6000 | grep ssh
これにより、指定されたポートでリッスンしているsshプロセスがあるかどうかがわかります。また、プロセスのPIDも通知します。
正しいオプションでsshプロセスが開始されたことを本当に確認したい場合は、次のようなPIDでプロセスを検索できます。
# ps aux | grep PID
autossh を使用します。 ssh接続を監視するためのツールです。
Psコマンドを使用して確認できます
# ps -aux | grep ssh
実行中のすべてのshhサービスが表示され、トンネルサービスが一覧表示されます
stunnelは、ホスト間を半永久的に接続するための優れたツールです。
これらは、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が表示されます。
バックグラウンドでsshを使用している場合、これを使用します。
Sudo lsof -i -n | egrep '\<ssh\>'
#!/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 < '