ルールがssh構成ファイルで結合されないのはなぜですか?


12

以下は期待どおりに動作するようです。つまり、最初のルールに一致するホスト名を持つ2番目のルールが適用されます。

Host *.hostname.com
 User myuser
 IdentityFile ~/.ssh/myidentity

Host blah
 HostName complicated.hostname.com

ただし、入力ssh blahすると2番目のルールのみが適用されます(最初のルールのユーザーファイルまたはIDファイルは適用されません)。

2つの質問があります。

  1. なんでこんなことが起こっているの?
  2. 私がやろうとしていることを(単純に)行うことは可能ですか?

回答:


9

ssh_configmanページから:

パラメーターごとに、最初に取得した値が使用されます。構成ファイルには、「ホスト」仕様で区切られたセクションが含まれ、そのセクションは、仕様で指定されたパターンのいずれかに一致するホストにのみ適用されます。一致したホスト名は、コマンドラインで指定されたものです。

各パラメーターで最初に取得した値が使用されるため、ファイルの先頭近くでホスト固有の宣言を追加し、末尾で一般的なデフォルトを指定する必要があります。

さらに、HostとPATTERNSの機能が不明な場合は、これら2つのセクションを理解していることを確認します。一致するレベルは1つだけです。この機能は、正規表現機能では非常に基本的ですが、一度使用すると強力です。

ホストセクション

 The possible keywords and their meanings are as follows (note that keywords 
 are case-insensitive and arguments are case-sensitive):

 Host    Restricts the following declarations (up to the next Host keyword) 
         to be only for those hosts that match one of the patterns given
         after the keyword.  If more than one pattern is provided, they 
         should be separated by whitespace.  A single ‘*’ as a pattern can 
         be used to provide global defaults for all hosts.  The host is the 
         hostname argument given on the command line (i.e. the name is not
         converted to a canonicalized host name before matching).

         A pattern entry may be negated by prefixing it with an exclamation 
         mark (‘!’).  If a negated entry is matched, then the Host entry is      
         ignored, regardless of whether any other patterns on the line 
         match.  Negated matches are therefore useful to provide exceptions 
         for wildcard matches.

         See PATTERNS for more information on patterns.

パターン

 A pattern consists of zero or more non-whitespace characters, ‘*’ (a 
 wildcard that matches zero or more characters), or ‘?’ (a wildcard that
 matches exactly one character).  For example, to specify a set of 
 declarations for any host in the “.co.uk” set of domains, the following
 pattern could be used:

       Host *.co.uk

 The following pattern would match any host in the 192.168.0.[0-9] network 
 range:

       Host 192.168.0.?

 A pattern-list is a comma-separated list of patterns.  Patterns within 
 pattern-lists may be negated by preceding them with an exclamation
 mark (‘!’).  For example, to allow a key to be used from anywhere within an 
 organisation except from the “dialup” pool, the following entry
 (in authorized_keys) could be used:

       from="!*.dialup.example.com,*.example.com"

階層化ルール

アプローチの問題は、1番目のホストセクションに一致するパターンが2番目のホストセクションに一致しないことです。私は通常このようなことをします:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

人々が通常これらのルールを受け入れないのは、繰り返すことができるということです。したがって、私がよくすることは複数のセクションを持ち、を使用してそれらを分割することですHost *

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2

3
あなたの例では、「user2」はどのように設定されていますか?ホストに対して最初に取得した値が使用されると考えたため、すべてのホストが最初のブロックに一致し、「user1」が設定されますか?
jdm 14年

@jdm-2番目以降にHost *一致するホストルールは、明示的に指定しない限り、user2をデフォルトユーザーとして使用します。
slm

@slm:実際には動作しないことがわかりました。2つのHost * User xxxをチェーンしてからHost * User yyyをチェーンすると、次のルールは「xxx」を使用します-何か間違ったことをしていない限り。
ジェレミー14

@slm、あなたの例は機能しません。2番目Host *に到達した時点で、「各パラメーターの最初の取得値」ルールが適用されるため、このUser定義および後続のすべての定義は無視されます。このルールの例外は、IdentityFileキーワードです。
maxschlepzig

5

SSHは、コマンドラインで指定されたホスト名に一致するすべてのセクションを適用します(つまり、検出されたHostNameルールは後続の条件チェックに影響しません)。CanonicalizeHostnameが有効になっている場合、更新されたホスト名を使用して、終了時に構成ファイルを再度適用します。(SSHバージョンのいくつかはこれに関係なくこれをCanonicalizeHostname行い、あなたの例はそれらのバージョンで動作しますが、それはSSH開発者によるバグと見なされます。#2267を参照してください。)

つまりCanonicalizeHostname、次を追加することで、サンプルを機能させることができます。

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

正規化は行われませんが、更新されたホスト名で2回目のパスを行うことができます。(設定の解析を「再帰的」にせずに、1回だけ繰り返すことに注意してください。ホスト名を2回変更すると、機能しなくなります。)


1
私は最近Ubuntu 14.04を16.04にアップグレードしましたが、それに伴ってこのバグが発生しました。この答えは完璧です。元の動作に戻ります。ありがとう!
ブライアンマレホーン

ugh#2267は、Host nickname; Hostname hostnameスタンザがニックネームを提供できなくなったことを意味します。CanonizalizeHostname yes各ニックネームブロックにキーワードを追加すると機能しますが、ニックネームブロックのサイズが2倍になり、見苦しくなります。
18

1

マニュアルページから

パラメーターごとに、最初に取得した値が使用されます。構成ファイルには '' Host ''仕様で区切られたセクションが含まれ、そのセクションは仕様で指定されたパターンのいずれかに一致するホストにのみ適用されます。一致したホスト名は、コマンドラインで指定されたものです。

各パラメーターで最初に取得した値が使用されるため、ファイルの先頭近くでホスト固有の宣言を追加し、末尾で一般的なデフォルトを指定する必要があります。

エントリの順序を切り替えてみてください。


残念ながら、エントリの順序の切り替えは機能しません(実際に最初に使用した順序です)。
ジェレミー14

接続しているホスト名に一致する複数のホスト定義がある場合、それらすべてで定義されているすべてのパラメーターは単一の定義にマージされます。「最初に取得した値」と表示されている場合は、ホストレベルではなく、パラメータレベルでのことです。各ホストブロックを定義として考えている場合、これは直感に反します。
ジョヴァンニティルローニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.