[unix] ssh 구성 파일에서 규칙이 결합되지 않는 이유는 무엇입니까?

다음과 같이 예상대로 작동하는 것처럼 보입니다. 즉, 첫 번째 규칙과 일치하는 호스트 이름을 가진 두 번째 규칙이 적용됩니다.

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

Host blah
 HostName complicated.hostname.com

그러나 입력 ssh blah하면 두 번째 규칙 만 적용되며 첫 번째 규칙의 사용자 또는 신원 파일은 적용되지 않습니다.

두 가지 질문이 있습니다.

  1. 왜 이런 일이 발생합니까?
  2. 내가하려는 일을 (간단히) 할 수 있습니까?


답변

로부터 ssh_config매뉴얼 페이지

각 매개 변수에 대해 첫 번째로 얻은 값이 사용됩니다. 구성 파일에는 “호스트”사양으로 구분 된 섹션이 포함되어 있으며 해당 섹션은 사양에 지정된 패턴 중 하나와 일치하는 호스트에만 적용됩니다. 일치하는 호스트 이름은 명령 행에 제공된 이름입니다.

각 매개 변수에 대해 첫 번째로 얻은 값이 사용되므로 파일의 시작 부분 근처에 더 많은 호스트 별 선언을 제공하고 끝에는 기본값이 있어야합니다.

또한 Host와 PATTERNS가 어떻게 작동하는지 확실하지 않은 경우이 두 섹션을 이해하도록하겠습니다. 일치하는 레벨은 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"

레이어링 규칙

접근 방식의 문제점은 첫 번째 호스트 섹션과 일치하는 패턴이 두 번째 호스트 섹션과 일치하지 않는다는 것입니다. 나는 일반적으로 다음과 같이합니다 :

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


답변

SSH는 명령 행에 제공된대로 호스트 이름과 일치하는 모든 섹션을 적용합니다 (즉 HostName, 발생 하는 규칙은 후속 조건 확인에 영향을 미치지 않습니다). CanonicalizeHostname활성화 된 경우 업데이트 된 호스트 이름을 사용하여 구성 파일이 완료되면 다시 구성 파일을 다시 적용합니다. (일부 SSH 버전은 관계 없이이 CanonicalizeHostname작업을 수행했으며 예제는 해당 버전에서 작동하지만 SSH 개발자는 버그로 간주합니다. # 2267 참조 )

다음 CanonicalizeHostname을 추가하여 예제를 작동시키는 데 사용할 수 있습니다.

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

정규화는 수행하지 않지만 업데이트 된 호스트 이름으로 두 번째 패스를 수행 할 수 있습니다. (여전히 구성 구문 분석을 “재귀 적”으로 만들지 않고 한 번만 반복하십시오. 따라서 호스트 이름을 두 번 변경하면 작동하지 않습니다.)


답변

매뉴얼 페이지에서

각 매개 변수에 대해 첫 번째로 얻은 값이 사용됩니다. 구성 파일에는“호스트 ”사양으로 구분 된 섹션이 포함되어 있으며 해당 섹션은 사양에 지정된 패턴 중 하나와 일치하는 호스트에만 적용됩니다. 일치하는 호스트 이름은 명령 행에 제공된 이름입니다.

각 매개 변수에 대해 첫 번째로 얻은 값이 사용되므로 파일의 시작 부분 근처에 더 많은 호스트 별 선언을 제공하고 끝에는 기본값이 있어야합니다.

출품작 순서를 바꿔보십시오.


답변