すでに確立されているSSHチャネルを使用する


50

2台のマシン間に既に確立されたssh接続があります。

ローカルマシンで実行されているシェルスクリプトから、すでに開いている接続を使用して、別のsshセッションを開始せずに、リモートマシンにコマンドを送信する方法はありますか?

回答:


56

事前に計画しておけば、OpenSSHの最近の十分なバージョンでは非常に簡単です。

初めてマスター接続を開きます。以降の接続では、既存のマスター接続を介してスレーブ接続をルーティングします。で~/.ssh/config、自動的に行われる接続共有を設定します。

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

既存の接続と同じ(ユーザー、ポート、マシン)に対してsshセッションを開始すると、2番目のセッションが最初のセッションを介してトンネリングされます。2番目の接続の確立には、新しい認証は必要なく、非常に高速です。


2番目のものは/ var / log / secureまたは/var/log/auth.logに登録されないようです。ただし、2番目のものは/ var / log / wtmpに登録されますか?
SOUser

@XichenLi /var/log/secureおよび/var/log/auth.logログSSH接続。既存の接続に便乗するため、スレーブ接続は表示されません。sshセッションが端末を割り当てた場合(つまりssh somehost、コマンドが提供されていない、またはssh -t)、wtmpその端末の表示方法に関係なく(通常)ログインします(接続を確立するために使用された方法、端末エミュレータアプリケーションなど)。
ジル「SO-悪であるのをやめる」

2
またControlPersist 600、ソケットが自動的に削除されるまでのアイドル状態の秒単位の遅延を使用することもできます。それ以外の場合、マスター接続が終了すると自動的に終了します。これは、一連のコマンドをリモートで実行するのには適していません(たとえば、さまざまなフォルダーに対する一連のrsyncコマンド)

2
グローバル構成を編集したくない場合は、SSHクライアントのオプション-S(ソケットの指定)および-M(マスター接続の作成)を使用することもできます。
ヤンキー

22

これは、ncツールとsshトンネルを使用して簡単に実現できます。

1. sshトンネルを開く

sshセッションで~C、新しい行に入力します。次のようなssh「サービスコンソール」プロンプトが表示されます。

ssh> 

入力し、ローカル前方 SSHトンネルを開くコマンド:

ssh> -L22000:targethost:22001
Forwarding port.

targethost接続先のマシンのホスト名またはIPアドレスはどこですか。

ここで、ターゲットマシンのsshサーバーがトンネルを禁止するように構成されていないと仮定すると、目的の接続転送sshがあります。マシンのクライアントはポート22000をリッスンし、送信されたトラフィックをの22001ポートに転送しtargethostます。

2.リモートマシンでネットワークサーバーを起動します

これは、すでに開いているsshセッションに次のコマンドを入力するのと同じくらい簡単です。

remote$ nc -l localhost 22001 | sh

これにより、sshトンネルのターゲットポートであるポート22001でリッスンするTCPサーバーが起動し、受信したデータ(おそらくシェルコマンド)をtargethostシェルインスタンスにルーティングします。

3.スクリプトをトンネル経由で送信します

local$ cat yourscript.sh | nc localhost 22000

これにより、スクリプトの本文がsshトンネルに送信され、最終的にのシェルで実行されtargethostます。端末のsshセッションでスクリプトの出力が表示されます。


また、このシナリオのsshトンネル(ステップ1.)は厳密には必要ないことに注意してください。サーバーを開いて起動し、インターネット経由で直接接続することもできます。ただし、ターゲットホストに直接到達できない場合(NATの背後など)、またはssh暗号化が必要な場合は、トンネルを使用する必要があります。


3
素晴らしい答え。技術的には、サービスコンソールにアクセスするには、~文字が改行の後に来る必要があるためLF ~ C、おそらくより良いシーケンスです。
Alexios

@Alexios、正しい。
ウリトコ

素晴らしいトリック!記録については、sshのマニュアルページにそれに関する詳細情報が表示されています(「エスケープ文字」というセクションまでスクロールします)
カールズサラ

@CarlesSala lessは、一般的なデフォルトのポケットベルである検索をサポートしいるため、キーワードを知っていればスクロールを節約できますman ssh /ESCAPE
ulidtko

@ulidtkoは確かですが、私が知る限り、CLIコマンドをSOコメントにリンクすることはできません。そのため、htmlのマニュアルページの方が良いオプションであることがわかりました;-)
カルレスサラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.