ソケットファイルがある場合、SSHは接続を再利用できます。ソケットを生成するには、次を使用します。
ssh -M -S /tmp/hello [email protected]
たとえば、このソケットファイルを使用してサーバー上でコマンドを実行するには、次のようにします。
ssh -S /tmp/hello example.com uname -a
SSHは使用時にhost
フィールドが必要-S /tmp/hello
ですが、関係ありません。以下は同じ効果があります。
ssh -S /tmp/hello whocares uname -a
SSHにホスト名が必要ですが、気にしないのはなぜですか?
SSHのこの動作(ソケットファイル()で説明されている接続を共有し、/tmp/hello
すべての資格情報を無視する)は、私が望んで期待するものです。しかし、ホスト名が必要少し混乱しています。
問題は、次のようにこのコマンドを使用すると問題が発生することです。
ssh -S /path/to/my-first-host.socket example.com .... # expect connecting first host
ssh -S /path/to/my-second-host.socket example.com .... # expect connecting second host
ssh -S /path/to/my-third-host.socket example.com .... # expect connecting third host
答え1
~/.ssh/config
などにより、SSH ホスト名に基づいて追加の構成を指定できます。/etc/ssh/ssh_config
コントロールソケットを介して接続する場合、ホスト名自体は重要ではないかもしれませんが、該当する場合は次のオプションが適用されます。
$ cat ~/.ssh/config
Host foo
LocalForward 8080 localhost:9000
$ ssh -fMS /tmp/hello localhost sleep 1d
muru@localhost's password:
$ ssh -fS /tmp/hello foo sleep 1d & sudo lsof -i :8080
[1] 6971
[sudo] password for muru:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 6859 muru 8u IPv6 148286 0t0 TCP ip6-localhost:http-alt (LISTEN)
ssh 6859 muru 9u IPv4 148287 0t0 TCP localhost:http-alt (LISTEN)
~/.ssh/config
明らかに、SSHは制御ソケットを使用しても私が指定したポート転送ルールを適用します。実際、ポート転送はソケットを作成するプロセスによって行われます。
$ pgrep -fa hello
6859 ssh -fMS /tmp/hello localhost sleep 1d
6971 ssh -fS /tmp/hello foo sleep 1d
答え2
SSHにホスト名が必要ですが、気にしないのはなぜですか?
コントロールソケットは、マニュアルページに記載されているように接続するホスト名に基づいている必要があるためですssh_config
。
ControlPath
上記のControlMasterセクションで説明されているように、接続共有に使用される制御ソケットのパスを指定するか、文字列noneを指定して接続共有を無効にします。 ControlPathのパラメータは、チルダ構文を使用して、ユーザーのホームディレクトリまたはTOKENSセクションで説明されているトークンを参照できます。 商談接続の共有に使用されるControlPathには、少なくとも%h、%p、および%r(または%C)を含めることをお勧めします。他のユーザーが書き込めないディレクトリに保存されます。 *これにより、共有接続が一意に識別されます。
これらの推奨事項に従わずに同じソケットを使用して別のホストに接続しようとする場合は、作成しssh
たホスト名に関係なく既存のソケットを見つけて使用します。
編集された質問に:
このコマンドを次のように使用すると問題が発生しますか?
ssh -S /path/to/my-first-host.socket example.com .... # expect connecting first host ssh -S /path/to/my-second-host.socket example.com .... # expect connecting second host ssh -S /path/to/my-third-host.socket example.com .... # expect connecting third host
はい。現時点では、執行/使用されていないが文書化されていない、または未定義の動作を明確に使用しており、将来のバージョンで予告なく変更される可能性があります。
答え3
ssh -S
マニュアルページのセクションについては、マニュアルページのssh
(5)とセクションを参照してください。ControlMaster
次のように指摘します。ControlPath
ssh_config
コントロールマスター 単一のネットワーク接続を介して複数のセッションを共有できます。 [...] これらのセッションは、新しいネットワーク接続を開始するのではなく、マスターインスタンスのネットワーク接続を再利用しようとします。ただし、制御ソケットが存在しない場合、または待機していない場合は、正常な接続が復元されます。
要約すると、ssh
可能であればコントロールソケットを使用し、それ以外の場合は通常の接続に置き換えます。通常の接続には宛先ホスト名が必要です。
ただしControlPath
、aの名前(テンプレート)には、少なくともターゲットホスト名(%h
)が含まれている必要があり、異なるターゲットホストが異なる制御パス値を受け取ることをお勧めします。各接続に対してランダムに異なるホスト名値を盲目的に使用する場合は、このアドバイスを適用できません。