Development2 min read

SSH Host dev-* 설정에서 dev-bastion만 제외하기: 부정 패턴 작성법

2026년 11월 14일2 min read작성자 Flature

Host 줄에 dev-*와 !dev-bastion을 공백으로 함께 지정하면 dev-bastion에는 해당 블록의 설정이 적용되지 않습니다. 구체적인 설정 예제로 패턴 해석과 제외 범위, 다른 블록의 영향을 구분합니다.

SSH Host dev-* 설정에서 dev-bastion만 제외하기: 부정 패턴 작성법

SSH 클라이언트 설정에 Host dev-* !dev-bastion이라고 작성하면 됩니다. dev-*에 해당하는 이름에는 블록의 설정을 적용하되, dev-bastion과 일치하면 그 블록 전체를 적용 대상에서 제외합니다.

개발 서버 공통 설정에서 한 서버만 빼야 할 때

개발 서버 이름이 dev-app, dev-db, dev-bastion처럼 같은 접두어를 쓰더라도, bastion에는 다른 접속 설정이 필요할 수 있습니다. 이때 공통 설정을 서버마다 복사하는 대신 와일드카드에 예외를 추가할 수 있습니다.

이 글은 OpenSSH 클라이언트의 ~/.ssh/config를 편집하는 상황을 전제로 합니다. 서버 측 설정이 아니라 접속을 시작하는 컴퓨터의 설정입니다.

같은 Host 줄에 포함 패턴과 제외 패턴 쓰기

Host dev-* !dev-bastion
    ConnectTimeout 8
  • dev-*: 공통 설정을 적용할 이름의 범위를 지정합니다.
  • !dev-bastion: 해당 이름이 일치하면 이 Host 블록을 제외합니다.
  • 여러 Host 패턴은 쉼표가 아니라 공백으로 구분합니다.

부정 패턴이 일치하면 같은 줄의 다른 패턴이 일치하더라도 블록은 적용되지 않습니다. 따라서 dev-bastion은 dev-*에도 일치하지만 제외 조건이 우선합니다. 블록의 범위는 다음 Host 또는 Match 지시어가 나오기 전까지입니다.

예제: 개발 서버는 8초, 제외된 서버는 공통 기본값 사용

다음은 적용 규칙을 설명하기 위한 설정입니다. 다른 곳에서 ConnectTimeout을 먼저 지정하지 않았고, 명령행 옵션으로도 값을 주지 않았다고 가정합니다. 호스트 이름 정규화에 따른 재처리도 사용하지 않는 예제입니다.

Host dev-* !dev-bastion
    ConnectTimeout 8

Host *
    ConnectTimeout 20
접속 명령 첫 번째 블록 해석 예상 ConnectTimeout
ssh dev-app 포함 패턴에 일치하고 제외 패턴에는 불일치 8초
ssh dev-bastion 제외 패턴이 일치하여 블록 적용 제외 20초
ssh prod-app 포함 패턴에 불일치 20초

dev-app에는 두 블록이 모두 일치하지만, ConnectTimeout은 먼저 얻은 값인 8을 사용합니다. dev-bastion은 첫 번째 블록에서 값을 얻지 않으므로 뒤의 Host *에서 20을 얻습니다. 이 값은 연결 수립과 초기 SSH 핸드셰이크·키 교환에 사용하는 제한 시간이며, 명령 실행 전체의 제한 시간은 아닙니다.

실제로 접속하려면 예제 이름이 해당 환경에서 해석되어야 하며, 서버 접근과 인증도 준비되어 있어야 합니다. 위 표는 설정 규칙에 따른 예상 해석으로, 접속 성공이나 실제 대기 시간을 보장하지 않습니다.

제외 범위와 이름 일치에서 주의할 점

  • 제외는 해당 블록에만 적용됩니다. dev-bastion이 다른 Host 블록이나 공통 기본값까지 무시하는 것은 아닙니다.
  • 기존 값을 취소하지 않습니다. 앞선 설정에서 이미 얻은 값을 부정 패턴이 삭제하거나 초기화하지 않습니다.
  • 접속할 때 쓰는 이름을 확인해야 합니다. Host는 일반적으로 명령행에 입력한 호스트 이름과 비교합니다. ssh dev-bastion.example.com으로 접속하면 !dev-bastion과는 일치하지 않으므로, 그 이름도 제외하려면 명시적으로 추가해야 합니다.
  • 이름 정규화를 사용하면 해석 조건을 더 확인해야 합니다. CanonicalizeHostname을 활성화한 구성에서는 변경된 이름으로 설정을 다시 처리할 수 있습니다.

먼저 실제 접속에 사용하는 이름을 기준으로 제외 패턴을 작성하고, 해당 블록의 적용 여부와 다른 블록에서 얻는 최종 값을 나누어 확인하세요.

참고한 공식 문서

이어서 확인할 내용