~/.ssh/config에 다음 설정이 있습니다.
match host devbox
compression yes
user hari
port 22
hostname 192.168.9.7
match originalhost devbox exec "~/.ssh/check_if_outside_home.sh"
hostname devbox.harisund.com
아이디어는 이렇습니다 -
- 항상 192.168.8.15에 연결하세요(이미 홈 네트워크에 연결되어 있으면 작동합니다).
- 집 LAN에 연결되어 있지 않으면 devbox.harisund.com에 연결하세요.
그러나 자세한 로깅을 통해 다음을 볼 수 있습니다.
1 OpenSSH_7.2p2 Ubuntu-4ubuntu2.2, OpenSSL 1.0.2g 1 Mar 2016
2 debug1: Reading configuration data /home/hsundararaja/.ssh/config
3 debug2: checking match for 'host devbox' host devbox originally devbox
4 debug3: /home/hsundararaja/.ssh/config line 734: matched 'host "devbox"'
5 debug2: match found
6 debug2: checking match for 'originalhost devbox exec "~/.ssh/check_if_outside_home.sh"' host 192.168.9.7 originally devbox
7 debug3: /home/hsundararaja/.ssh/config line 744: matched 'originalhost "devbox"'
8 debug1: Executing command: '~/.ssh/check_if_outside_home.sh'
9 debug1: permanently_drop_suid: 14741
10 debug3: command returned status 0
11 debug3: /home/hsundararaja/.ssh/config line 744: matched 'exec "~/.ssh/check_if_outside_home.sh"'
12 debug2: match found
13 debug1: /home/hsundararaja/.ssh/config line 839: Applying options for *
14 debug1: Reading configuration data /etc/ssh/ssh_config
15 debug1: /etc/ssh/ssh_config line 19: Applying options for *
16 debug2: resolving "192.168.9.7" port 22
17 debug2: ssh_connect_direct: needpriv 0
18 debug1: Connecting to 192.168.9.7 [192.168.9.7] port 22.
19 debug2: fd 3 setting O_NONBLOCK
20 debug1: connect to address 192.168.9.7 port 22: Connection timed out
21 ssh: connect to host 192.168.9.7 port 22: Connection timed out
4행에서는 ~/.ssh/config의 첫 번째 섹션을 확인합니다. 이 시점에서 호스트 이름은 192.168.9.7로 변경됩니다. 여태까지는 그런대로 잘됐다.
7행에서는 두 번째 스탠자에 도달합니다.
8번째 줄에서는 우리가 집 밖에 있는지 확인하고 0을 반환합니다. 예상대로.
12행에서는 이것이 일치한다고 말합니다. 이는 호스트 이름을 devbox.harisund.com으로 변경해야 함을 의미합니다.
그러나 16행에서는 설정된 로컬 호스트 이름을 여전히 사용하고 있음을 알 수 있습니다.
왜? 이것이 예상되는 동작입니까?
답변1
이는 설계 및 문서화된 대로입니다 man 5 ssh_config
.
각 매개변수에 대해 처음 얻은 값이 사용됩니다. 구성 파일에는 호스트 사양으로 구분된 섹션이 포함되어 있으며, 이 섹션은 사양에 제공된 패턴 중 하나와 일치하는 호스트에만 적용됩니다. 일치하는 호스트 이름은 일반적으로 명령줄에 지정된 호스트 이름입니다(예외에 대해서는 CanonicalizeHostname 옵션 참조).
각 매개변수에서 처음 얻은 값을 사용하므로 파일 시작 부분에 더 많은 호스트별 선언을 제공하고 끝 부분에 일반 기본값을 제공해야 합니다.
즉, match originalhost
기존 항목을 덮어쓸 수 없으며 hostname
순서를 바꾸면 괜찮을 것입니다.