スクリプトでSSH接続を使用する場合のSSHポート転送

スクリプトでSSH接続を使用する場合のSSHポート転送

SSH経由でデバイスに接続するときは、まず次の方法でSSHメニューに移動する方法を知っています[ENTER} ~C-L 4455:ip:80

これにより、ローカルシステムのlocalhost:4455がリモートデバイスのポート80に移動します。

この手動アクションをスクリプトにどのように配置できますか?ここで唯一の変数はリモートデバイスのIPアドレスですが、自動的にインポートする方法はわかっていますが、sshメニューにコマンドをプッシュする方法はわかりません-L 4455:ip:80

答え1

紹介する

最近、次の記事に触れました。https://hackertarget.com/ssh-examples-tunnels/SSH接続とポート転送についてたくさん説明していますので、ぜひご覧ください。たくさん学ぶことができるでしょう:)

あなたに関連する内容は次のとおりです。


SSHトンネリング(ポート転送)

最も単純なSSHトンネルは、トンネルの反対側の端にある別のポートに接続されているローカルシステムのポートを開きます。

localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserver

-Lパラメータを分析してみましょう。 -L をローカルリスナーとして処理します。したがって、上記の例では、ポート9999はlocalhostでリッスンしており、そのポートはリモートサーバーのポート80に転送されます。 127.0.0.1は、リモートサーバーのlocalhostを表します。

さらに一歩進みましょう。次の例では、ローカルネットワーク上の他のホストでリッスンしているポートに接続できます。

localhost:~$ ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver

この例では、私たちが接続しているポートはリッスンしているWebサーバーです。プロキシサーバーまたは他のTCPサービスにすることもできます。


はい

上記は現在アクティブなSSHシェルを開きます。ポートだけを転送しようとしているので、これは必要ありません。コマンドに-Nパラメータを追加して、リモートコマンドの実行をスキップできます(パブリックシェルもコマンドです)。このssh manページではこれについても説明します。

-N Do not execute a remote command. This is useful for just forwarding ports.

したがって、次のスクリプトはctrl-c / killを押すまでポートを開きます。

#!/usr/bin/env sh

echo "Forwarding ports"
ssh -N -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver

sleepコマンドを実行して-Nパラメータを削除して、数秒間ポートを開くこともできます。

ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver "sleep 10"

決定的な

これらのSSHトンネルには欠点があります。転送されたポートを長時間開いたままにするには、次のスレッド、特に次のセクションを確認することをお勧めしますautosshhttps://superuser.com/questions/37738/how-to-reliously-keep-an-ssh-tunnel-open

答え2

私は最近あなたが要求したものと似たようなことをしなければなりませんでした。これは、sshを使用してポート転送を自動化し、そのアドレスからブラウザを開くスクリプトを持つことです。これを達成するために、sshコマンドの自動化された動作をシェルスクリプトと組み合わせました。私は説明のためにMacOSを使用しています。

私の ~/.ssh/config ファイルには次のようなエントリがあります。

Host remoteserver
     HostName [ip address here]
     User [username]
     IdentityFile [path to secret.pem]

だから、あなたが入ったらssh remoteserverそこにつながることを知っています。次に、すでにPATHにあるディレクトリに次のようにonという別のスクリプトを設定しますmonitorchmod +x

#!/bin/bash
ssh -L 9999:localhost:80 $1 -N &
open -na Google\ Chrome --args --new-window "http://localhost:9999"

したがって、入力中にmonitor remoteserverSSHを使用して自動的にポート転送を設定し、適切なアドレスでGoogle Chromeを開きます。

簡単に説明すると、$1スクリプトファイル名の後に続くパラメータを示します。 -Nこれは、リモートサーバーのターミナルシェルを必要としないことを意味します。 &非ブロック実行を意味します。ない場合は、ブラウザウィンドウを開く次のコマンドは、SSHingが完了するのを待ちます。これは欲しいものではありません。 Openこれは通常、MacOS用Darwinで使用するものです。 Linuxに適したバージョンを見つけるには、参照する必要がありますが、それほど難しくありません。 -naCombine New Process and Applicationフラグを意味し、--args --new-window以前の-nフラグが重複しているように見えますが、私の経験ではChromeで最もうまく動作するようです。

お役に立てば幸いです。

関連情報