~ / .ssh / config에서 SSH 호스트 항목을 동적으로 생성


9

ssh를 통해 전체 호스트 더미를 관리해야합니다. 그러나 특정 게이트웨이 ssh 서버를 통해서만 액세스 할 수 있습니다.

내 안에 다음이 있습니다 ~/.ssh/config.

Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

그러나 나는이 많은 기계에 연결해야합니다. 내에 수십 개의 항목을 넣는 대신 ~/.ssh/config어쨌든 다음과 같은 것을 가질 수 있습니까?

Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

나는 당신 %hHostname인수에 사용할 수 있다는 것을 알고 있지만 그것이 호스트 이름 일 것입니다. 내가 정말로 필요한 것은 bash 's와 같은 일종의 문자열 대체 ${VAR%thingie}입니다. 이것이 가능한가?

답변:


24

다음 SSH 구성 파일을 사용하여 수행 할 수 있습니다.

Host *
  ServerAliveInterval 120

Host gateway.somewhere.com
  User jdoe

Host gateway+*
  User jdoe
  ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null
  ControlMaster auto
  ControlPath ~/.ssh/ssh-control_%r@%h:%p

그런 다음 내부 호스트에 다음과 같이 액세스하십시오.

ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com

오른쪽 절반에 선택한 이름은 점프 호스트가 해결할 수 있어야합니다.

User 매개 변수는 다른 호스트 클래스의 다른 사용자에게 수동으로 맵핑해야하는 경우에 지정됩니다. SSH 연결 재사용을 허용하도록 ControlMaster 및 ControlPath가 지정되었습니다.


6

명령 행에서 호스트 이름을 지정할 수 있으므로 HostName을 수동으로 지정할 필요가 없습니다.

간단히 시도하십시오 :

Host *.domain  
  IdentityFile ~/.ssh/id_rsa  
  ProxyCommand ssh mygateway /usr/bin/nc %h 22

이 접근 방식의 문제점은 호스트 이름이 매우 일반적인 것인데 (예 : db1, www, mail2), 'db2'라는 다른 머신으로 ssh해야 할 수도 있기 때문에 프로젝트 이름을 접두어로 사용하고 싶습니다. 따라서 호스트의 접두사
Rory

2
실제로 DNS를 재구성하고 싶습니다. 가장 단순하지만 가장 성가신 솔루션은 호스트 파일을 수정하는 것입니다. 반면에 항상 .invalid 도메인을 사용하여 워크 스테이션에 로컬 DNS 서버를 추가하고 원하는 호스트 이름을 사용할 수 있습니다.
Martin M.

이전 +1 각 프로젝트에 대한 하위 도메인을 작성하십시오. DNS는 당신의 인생을 더 쉽게 만들어 줄 것입니다;)
Dan Carley

1

이 작업을 수행 할 방법이없는 것 같습니다.


1

비슷한 문제가 발생하여 모든 상용구를 생성하는 스크립트를 작성했습니다. 더 이상 ~ / ssh / config를 변경하지 않고 ~ / ssh / config.in을 변경하고 스크립트를 다시 실행합니다.


1
스크립트를 공유 하시겠습니까? 나는 이것을 생각했지만 강력하고 일반적인 솔루션을 얻으려면 많은 노력이 필요할 수 있습니다. 귀하의 솔루션이 아직 그렇지 않더라도, 귀하가 생각하는 바가 무엇인지, 그리고 그것을 끝내면 다르게 무엇을할지 아는 것이 도움이 될 것입니다.
iconoclast

내 생각은 .ssh/config.d각 템플릿마다 파일 을 가지고 있었고 각 템플릿은 final에서 하나 이상의 항목을 생성합니다 ~/.ssh/config. 범용 변수가있는 파일도 있지만 각 템플릿에는 맨 위에 나열된 전역 변수보다 우선 순위가 높은 고유 변수가있을 수 있습니다. ~/.ssh/config파일은 필요에 따라 또는 생성 될 수있는 일정-는 것이 문제가되지-만큼 당신이 당신이 보존 싶다고 그것을 직접 편집을 만든 적이있다.
iconoclast

내 스크립트는 완전히 문서화되어 있지 않으며 문서 나 예제가 없으면 이해할 수 없다고 생각합니다.이 문서는 만들 시간이 없습니다.
Michael Hoffman

이해할 수 있는. 내가 설명한 접근법에 대한 의견은 특히 중요한 요구 사항이나 유스 케이스 또는 큰 (또는 작은) 장애물을 간과하고 있다면 감사하겠습니다.
iconoclast

1
나는 그것이 내가 사용한 접근법보다 약간 덜 혼란스러운 훌륭한 접근법이라고 생각합니다. 많은 호스트 선언을 메모리로 읽은 다음 많은 비 호스트 선언을 읽습니다. 비 호스트 선언은 다른 호스트가있을 때까지 현재 그룹의 각 호스트에 적용됩니다. 또한 글 로빙 사용을 포함하여 파일에서 호스트가 여러 번 선언되도록 허용합니다. 결국 나는 내가 기억하고있는 모든 것을 기록한다.
Michael Hoffman 17

1

Hostname선언을 통해 직접 호스트 이름을 재정의하도록 지정 하지 말고 런타임에 호스트 이름 을 결정하십시오. 명령에서 참조하는 데 ProxyCommand사용하여의 일부로 평가 %h하여 수행하십시오 ( %p22로 하드 코딩 포트 대신 사용 ).

Host mygateway-*
   #Hostname ???WHAT GOES HERE????
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc $(echo %h|sed 's/^mygateway-//') %p

더 일반적인 스탠자를 가질 수도 있습니다. 따라서 a없이 호스트를 지정 -하거나 일치하는 다른 스탠자에 -따라 지정할 수 있지만 다음과 같이 일반적인 스탠자 를 사용하면됩니다 <gateway>-<target>.

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh $(echo %h|cut -d - -f1) nc $(echo %h|cut -d - -f2-) %p

또한 최신 버전의 SSH 클라이언트 [-W host:port]nc(netcat) 과 동일한 기능을 직접 수행하는 옵션을 지원합니다 . 따라서 수정 된 것을 사용할 수 있습니다 :

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh -W $(echo %h|cut -d - -f2-):%p $(echo %h|cut -d - -f1)

물론, 유한 한 호스트 목록이 있다면 언제든지 다음을 수행 할 수 있습니다.

Host host1 host2 host3 hostN
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc %h %p

도움이 되었기를 바랍니다!


0

동일한 설정의 클라이언트가 있었고 DSSH 를 사용 하여 문제를 해결했습니다.
무엇보다도 DSSH를 사용하면 게이트웨이 호스트를 통해 원격 호스트에 투명하게 로그인 할 수 있습니다.

사용 사례

  • "ena"로그인이 필요한 Cisco 라우터에서 구성 매개 변수 수집
  • 종료 상태를 유지하면서 PermitRootLogin이 root로 직접 비활성화 된 서버에 로그인 (자동으로 su-및 암호를 입력하여)
  • 고급 로깅과 같은 사용자 지정 논리 추가
  • 대상 서버에 연결하기 위해 여러 연결을 통해 터널링

5
~ / .ssh / config에서 할 수있는 일을 위해 Java를 사용하는 임의의 타사 ssh 클라이언트를 사용하지 않고 싶습니다.
Rory

링크가 죽었습니다
iconoclast

소프트웨어 소스는 Github에서 찾을 수 있습니다 : github.com/digmia/dssh
Guest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.