編集された質問に:

編集された質問に:

ソケットファイルがある場合、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次のように指摘します。ControlPathssh_config

コントロールマスター 単一のネットワーク接続を介して複数のセッションを共有できます。 [...] これらのセッションは、新しいネットワーク接続を開始するのではなく、マスターインスタンスのネットワーク接続を再利用しようとします。ただし、制御ソケットが存在しない場合、または待機していない場合は、正常な接続が復元されます。

要約すると、ssh可能であればコントロールソケットを使用し、それ以外の場合は通常の接続に置き換えます。通常の接続には宛先ホスト名が必要です。

ただしControlPath、aの名前(テンプレート)には、少なくともターゲットホスト名(%h)が含まれている必要があり、異なるターゲットホストが異なる制御パス値を受け取ることをお勧めします。各接続に対してランダムに異なるホスト名値を盲目的に使用する場合は、このアドバイスを適用できません。

関連情報