web-dev-qa-db-ja.com

ssh -L複数のポートを転送

私は現在、次のものを実行しています:

Sudo ssh -L PORT:IP:PORT root@IP

ここで、IPは保護されたマシンのターゲットであり、PORTは転送するポートを表します。

これは、この転送なしではアクセスできない多くのアプリケーションを使用しているためです。これを実行した後、localhost:PORTからアクセスできます。

主な問題は、これらのポートのうち4つを実際に転送する必要があるために発生しました。

私の解決策は、4つのシェルを開き、常に履歴を逆方向に検索して、どのポートを転送する必要があるかなどを正確に探してから、このコマンドを実行します-各シェルに1つ(パスワードを入力する必要があります).

次のようなことができる場合にのみ:

Sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

それはすでに本当に役立つでしょう。

これを簡単にする方法はありますか?

85
PascalVKooten

同じコマンドで-Lオプションを再度使用します。毎回異なるポートで。

141
NaN

正確に NaN と答えた場合、複数の-L引数を指定します。私はいつもこれをしています。マルチポート転送の例を次に示します。

ssh remote-Host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

localhostを指定しない場合、これは-L localhost:8822:REMOTE_IP_1:22と同じです。

これで、次のことができます(別の端末から):

ssh localhost -p 8822

ポートREMOTE_IP_122に接続するには

同様に

ssh localhost -p 9922

ポートREMOTE_IP_222に接続するには

もちろん、これをスクリプトにラップしたり、特定の特定のホスト/ポートに転送する多くの異なるホスト/ポートがある場合に自動化することを妨げるものは何もありません。

お役に立てれば。

68
jbchichoko

次のbash関数を使用できます(~/.bashrcに追加するだけです):

function pfwd {
  for i in ${@:2}
  do
    echo Forwarding port $i
    ssh -N -L $i:localhost:$i $1 &
  done  
}

使用例:

pfwd hostname {6000..6009}
18
Yuval Atzmon

jbchichokoとyuvalは実行可能なソリューションを提供しています。ただし、jbchichokoの答えは関数としての柔軟な答えではなく、yuvalの答えによって開かれたトンネルはバックグラウンドで実行されるため、ctrl+cによってシャットダウンできません。私は2つの欠陥を解決する解決策を以下に示します:

~/.bashrcまたは~/.zshrcでの関数の定義

# fsshmap multiple ports
function fsshmap() {
  echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt
  for ((i=($1+1);i<$2;i++))
  do
    echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt
  done
  line=$(head -n 1 $HOME/sh/sshports.txt)
  cline="ssh "$3" "$line
  echo $cline
  eval $cline
}

関数の実行例:

fsshmap 6000 6010 hostname

この例の結果:

127.0.0.1:16000~16009と同じhostname:6000~6009にアクセスできます

7
Tom

)同じHostを介して複数のポートを転送するユーザーの場合、〜/ .ssh/config

Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4

そして、それは簡単なssh all-port-forwardsになります。

2
RajaRaviVarma

ポート転送を使用してサーバーにログインする利点の1つは、Jupyterノートブックの使用を促進することです。この link は、その方法に関する優れた説明を提供します。ここで、皆さん全員が参照できるように、要約と拡張を行いたいと思います。

状況1. Host-Aという名前のローカルマシン(たとえば、自分のラップトップ)からHost-Bという名前のリモート作業マシンにログインします。

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

次に、ブラウザを開いて次のように入力します。 http:// localhost:port_A / Host-Bで作業を行いますが、Host-Aで確認できます。

状況2. Host-Aという名前のローカルマシン(たとえば、自分のラップトップ)からHost-Bという名前のリモートログインマシンにログインし、そこからHost-Cという名前のリモート作業マシンにログインします。これは通常、大学内のほとんどの分析サーバーに当てはまり、ssh -Lで接続された2つの-tを使用して実現できます。

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

次に、ブラウザを開いて次のように入力します。 http:// localhost:port_A / Host-Cで作業を行いますが、Host-Aで確認できます。

状況3. Host-Aという名前のローカルマシン(たとえば、自分のラップトップ)からHost-Bという名前のリモートログインマシンにログインし、そこからHost-Cという名前のリモート作業マシンにログインし、最後にリモート作業マシンHost- D.これは通常そうではありませんが、いつか起こるかもしれません。これは状況2の拡張であり、同じロジックをより多くのマシンに適用できます。

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

次に、ブラウザーを開いて、次のように入力します。 http:// localhost:port_A / Host-Dで作業を行いますが、Host-Aで確認できます。

Port_A、port_B、port_C、port_Dは、リストされている一般的なポート番号を除いて、乱数にすることができます here 。状況1では、port_Aとport_Bを同じにして、手順を簡素化できます。

1
Fei Yao

ポート転送を使用してサーバーにログインする利点の1つは、Jupyterノートブックの使用を促進することです。この link は、その方法に関する優れた説明を提供します。ここで、皆さん全員が参照できるように、要約と拡張を行いたいと思います。

状況1. Host-Aという名前のローカルマシン(たとえば、自分のラップトップ)からHost-Bという名前のリモート作業マシンにログインします。

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

次に、ブラウザを開いて次のように入力します。 http:// localhost:port_A / Host-Bで作業を行いますが、Host-Aで確認できます。

状況2. Host-Aという名前のローカルマシン(たとえば、自分のラップトップ)からHost-Bという名前のリモートログインマシンにログインし、そこからHost-Cという名前のリモート作業マシンにログインします。これは通常、大学内のほとんどの分析サーバーに当てはまり、ssh -Lで接続された2つの-tを使用して実現できます。

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

次に、ブラウザを開いて次のように入力します。 http:// localhost:port_A / Host-Cで作業を行いますが、Host-Aで確認できます。

状況3. Host-Aという名前のローカルマシン(たとえば、自分のラップトップ)からHost-Bという名前のリモートログインマシンにログインし、そこからHost-Cという名前のリモート作業マシンにログインし、最後にリモート作業マシンHost- D.これは通常そうではありませんが、いつか起こるかもしれません。これは状況2の拡張であり、同じロジックをより多くのマシンに適用できます。

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

次に、ブラウザーを開いて、次のように入力します。 http:// localhost:port_A / Host-Dで作業を行いますが、Host-Aで確認できます。

Port_A、port_B、port_C、port_Dは、リストされている一般的なポート番号を除いて、乱数にすることができます here 。状況1では、port_Aとport_Bを同じにして、手順を簡素化できます。

0
Fei Yao

私は loco を開発しました。これはssh転送を支援するためのものです。同じポートでリモートでローカルにポート5000と7000を共有するために使用できます。

pip install loco

loco listen SSHINFO -r 5000 -r 7000
0
PascalVKooten