실습 · 연습문제 1개
~/.ssh/config가 실제로 적용하는 값 찾기 ssh-config-lookup
ssh gpu1을 실행하면 ssh는 ~/.ssh/config를 위에서 아래로 읽으며 gpu1에 맞는 Host 블록의 설정을 모은다. 이때 각 설정은 처음 얻은 값이 쓰인다. 그래서 구체적인 Host를 위에, Host * 같은 기본값을 아래에 둔다. 실제 서버에서는 ssh -G gpu1이 최종 값을 보여 준다. 이 규칙을 직접 구현한다.
함수 resolve(config_text, host)를 완성해, host로 접속할 때 적용되는 설정을 dict로 반환한다.
문법(이 연습문제에서 다루는 범위)
- 빈 줄과
#로 시작하는 줄은 무시한다. 앞뒤 공백도 무시한다. - 한 줄은
키 값또는키=값이다. 키는 대소문자를 구분하지 않으므로 결과의 키는 소문자로 쓴다. 값은 그대로 둔다(앞뒤 공백만 제거). Host 패턴1 패턴2 ...줄이 새 블록을 시작한다. 첫Host줄 이전의 설정은 모든 호스트에 적용된다.- 패턴에는
*(아무 문자열)와?(한 글자)를 쓸 수 있다. 패턴 중 하나라도 맞으면 블록이 적용된다. !로 시작하는 패턴(예:!gpu-old)이 맞으면, 다른 패턴이 맞더라도 그 블록 전체를 적용하지 않는다.- 각 키는 처음 얻은 값만 쓴다. 단,
identityfile은 예외로 맞는 값을 모두 순서대로 모은 리스트로 반환한다(ssh는 여러 키를 차례로 시도한다). Match블록,Include는 다루지 않는다.
예:
Host gpu*
User lab
Host *
User kim
ServerAliveInterval 60
resolve(text, "gpu1") == {"user": "lab", "serveraliveinterval": "60"}