2.3 SSH와 원격 접속

실습 · 연습문제 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"}