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


12

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

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

Host blah
 HostName complicated.hostname.com

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

두 가지 질문이 있습니다.

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

답변:


9

로부터 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

3
귀하의 예에서 "user2"는 어떻게 설정 되었습니까? 호스트에 대해 첫 번째로 얻은 값이 사용되었다고 생각하여 모든 호스트가 첫 번째 블록과 일치하고 "user1"이 설정되어 있습니까?
jdm

@jdm- Host *일치 하는 2nd 이후의 호스트 규칙은 명시 적으로 지정하지 않는 한 user2를 기본 사용자로 사용합니다.
slm

@ slm : 실제로 작동하지 않는 것으로 나타났습니다. 두 개의 Host * User xxx를 연결 한 다음 Host * User yyy를 연결하면 다음 규칙에서 "xxx"를 사용합니다.
Jérémie

@ slm, 귀하의 예가 작동하지 않습니다. 두 번째 Host *에 도달 할 때 '각 매개 변수에 대해 첫 번째로 얻은 값이 사용됩니다'규칙이 적용되므로이 User정의 와 다음 정의는 모두 무시됩니다. 이 규칙의 예외는 IdentityFile키워드 btw입니다.
maxschlepzig 2016 년

5

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

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

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

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


1
나는 최근 Ubuntu 14.04를 16.04로 업그레이드 했으며이 버그가 발생했습니다. 이 답변은 완벽합니다. 그것은 원래의 행동으로 바로 되돌아갑니다. 감사!
Brian Malehorn

웃음 # 2267은 Host nickname; Hostname hostname스탠자가 더 이상 별명을 제공 할 수 없음을 의미합니다 . CanonizalizeHostname yes각 닉네임 블록에 키워드 를 추가하면 작동 하지만 닉네임 블록 크기가 두 배가되고보기 흉한 모양입니다.
studog

1

매뉴얼 페이지에서

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

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

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


불행히도 항목 순서를 전환해도 작동하지 않습니다 (실제로 원래 사용한 순서였습니다).
Jérémie

연결중인 호스트 이름과 일치하는 호스트 정의가 여러 개인 경우 모든 호스트 정의에 정의 된 모든 매개 변수가 단일 정의로 병합됩니다. "첫 번째로 얻은 값"이라고 말하면 호스트 수준이 아니라 매개 변수 수준의 항목에 대한 것입니다. 각 호스트 블록을 정의로 생각하면 직관적이지 않습니다.
Giovanni Tirloni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.