OpenSSH sshのControlPathオプションで単に%hを使用しないのはなぜですか?


12

「ssh_config(5)」マンページが、各共有接続を一意に識別するために、ControlPathオプションに少なくとも%h%pおよび%rプレースホルダーを含めることを推奨するのはなぜですか?

複数のセッションが同じホストへの接続で同じソケットを共有する必要あると考えました。その場合、次のような単純な定義を持つことは意味がありませんか?

ControlPath ~/.cache/ssh/mux/%h

次のようなものの代わりに:

ControlPath ~/.cache/ssh/mux/%r@%h:%p

最初の定義を理解すると、1つの接続が、異なるリモートポート上の同じリモートホストへの、異なるリモートユーザーとの複数のセッション間で共有されます。

ホストのデフォルトセクションに最初の定義がありたいので、それで十分ssh -o ControlMaster=noです。

リモートユーザーとリモートポートに関係なく、同じローカルユーザーによって開始されたすべてのセッション間で同じリモートホストへの接続を共有したい。マスタークライアントのソケットは、ローカルユーザーのホームディレクトリの下に存在する必要があります。


「リモートユーザーとリモートポートに関係なく、同じローカルユーザーによって開始されたすべてのセッション間で同じリモートホストへの接続を共有したい。」簡単な答え:できません。答えに一種の説明を追加しました。
goldilocks

回答:


12

「複数のセッションが同じホストへの接続で同じソケットを共有する必要があると考えました。」

彼らはできます。ただし、ControlPathログインするユーザーに関係なく、既存の接続を使用してホストに接続する場合、接続の元のユーザーとしてログインすることに注意してください。たとえば、「どこか」への接続が確立されていない場合:

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=yes bob@somewhere

このセッションはbob @ somewhereです。

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=no sue@somewhere

同じControlPathを使用してsetしたため、このセッション bob @ somewhereになりますControlMaster=no。の場合ControlMaster=yes、sueとしてログインしますが、sshは次のようにControlPath引数を無視しますman ssh_config

追加のセッションは、ControlMasterを 'no'に設定して、同じControlPath 使用してこのソケットに接続できます

この証拠としてControlMaster=yes、両方の場合で、bobが終了する~/.ssh/somewhereと、「スー」セッションがまだ実行されているにもかかわらずControlPathソケットが消えます。つまり、sueセッションはそのソケットを使用しません

したがって、同じ接続を使用する場合%hは問題ありませんが、接続を複数の異なるリモートユーザーとして共有できないことに注意しください-ssh では許可されません。


どうもありがとう。詳細な回答の前に、2番目のリモートユーザーが最初のリモートユーザーのIDを引き継ぐことなく、異なるリモートユーザー間でクライアントのマスターソケットを共有することができないという事実を逃しました。
ティムフリスケ

5

同じサーバーでも、複数のユーザーと複数のポートを使用できます。私自身、会社のイントラネット上の何百ものシステムに接続していますが、ほとんどのシステムには異なる機能またはアプリサーバーを持つ複数のユーザーがいます。userAへのアクセスはuserBへのアクセスとは大きく異なり、マスター接続は異なる必要があります。より簡潔に、実行する場合:

$ ssh -n -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userA localhost sleep 10 & # create the master connection and background it
$ ssh -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userB localhost whoami
userA

ご覧のとおり、userBとのOpenSSHセッションは取得しませんが、userAとの元のセッションは取得します。つまり、ホームディレクトリ、アクセス許可、さらには認証自体が予期されているものではありません。これを使用して、userBのディレクトリ内のファイルを削除しようとすると、a)ファイルが間違っている可能性があり、b)パーミッションが間違っている可能性があります。

単一のポートを使用して、1つのサーバー上の複数のユーザーに決して接続しない場合は、はい、使用%hするだけで十分です。あなたには~/.ssh/config、ファイルは、使用したいと思います。

ControlMaster=auto  # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes

このControlPersistオプションを使用すると、マスター接続は強制終了されるか、で終了するまでバックグラウンドで開いたままになりますssh -O exit。これは素晴らしいセット・イット・アンド・フォーゲット・イット機能です。

ただし、1つのホストで複数のユーザーに接続する可能性がある場合はより安全なものが必要です。

ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes

私はまだ混乱しています。「私はしたい」の段落で、構成シナリオと私の意図を明確にしようとしました。あなたの誰かがこの追加情報で私の質問にもっと正確に答えることができますか?
ティムフリスケ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.