.ssh / config 호스트에 여러 개의 HostName 항목이있을 수 있습니까?


10

집에 있지 않을 때 홈 네트워크의 컴퓨터에 ssh를 넣을 수 있도록 ssh 및 라우터 포트 전달을 설정했습니다. 현재 .ssh/config파일에 두 개의 항목이 있는데, 하나는 홈 네트워크에있을 때와 다른 하나는 내가없는 경우에 대한 것입니다.

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

이것은 효과가 있지만 일을 더 쉽게 할 수 있는지 궁금합니다. 첫 번째가 실패하면 두 번째로 다시 돌아가도록 여러 개의 HostName 항목을 나열하는 방법이 있기를 바랍니다.

Host mycomputer
  HostName 192.168.X.X
  HostName my.no-ip.dynamic

먼저 로컬 네트워크의 호스트에 연결을 시도하고 존재하지 않는 경우 IP가없는 동적 호스트 이름을 사용하여 연결을 시도합니다. 두 개의 HostName을 입력하려고 시도했지만 ssh mycomputer아무것도 수행하지 않는 블록 만 실행했습니다 .

키를 선호하여 암호 인증을 꺼서 홈 네트워크에 있지 않을 때 실수로 로컬 네트워크의 컴퓨터에 연결하면 암호가 다른 곳으로 갈 위험이 없어야합니다.

첫 번째 호스트 이름이 작동하지 않으면 대체 호스트 이름을 지정할 수 있습니까?


unix.stackexchange.com/questions/424755/… 는 비슷하며 아마도 포트 대신 호스트 이름에 맞게 조정될 수 있습니다
thrig

BTW, .ssh/config특정 속성에 대한 스크립트를 실행할 수 있습니다. ProxyCommand로 할 수 있다는 것을 알고 있습니다. SF-serverfault.com/questions/401233/… 에서이 Q & A에 표시된대로 무언가를 수행 할 수 있습니다.
slm

답변:


8

추악하지만 포트 노크의 종료 상태에 대한 기준을 사용하여 수행 할 있다고 생각합니다.execMatch

Host mycomputer
  Match exec "nc -z 192.168.1.11 %p"
    HostName 192.168.1.11
  Match !exec "nc -z 192.168.1.11 %p"
    HostName my.no-ip.dynamic

이렇게하면 실제로 "자신의"홈 네트워크에 있는지 여부를 알 수 없으며 동일한 주소 / 포트에서 서비스를 수신하는 것과 동일한 주소 범위를 가진 사설 LAN 세그먼트에 있다는 것입니다.


1
나는을 추가해야했다 . -w 1그렇지 않으면 nc영원히 기다리는 것처럼 보였다. Match exec "true"첫 번째 경기가 실패하면 두 번째 경기를 맹목적으로 시도하기 때문에 두 번째 경기가 더 간단 할 수 있습니다 .
코리 오그 번

@CoreyOgburn 아 예 대체 조건을 수행하는 더 좋은 방법을 생각하고 있었다 (연민 Match은 없습니다 Else)
steeldriver

그래서이 접근법에 문제가 발생했습니다. 나는 또한 사이트를 실행 xyz.com 말, 내가하려고 할 때 ssh xyz.comMatch exec "true"잡은 내 원격 호스트 이름을 사용하여 내 홈 서버에 저를 재 것이다. 나는 당신의 임원과 함께 시도 할 것이지만 같은 일이 일어날 것이라고 생각합니다.
코리 오그 번

예,를 사용 Match exec... Match !exec하면 다른 도메인에 ssh'ing Match !exec하여 호스트 이름 을 트리거 하고 다시 작성합니다.
코리 오그 번

2
따라서 ~/.ssh/config들여 쓰기에 덜 신경 쓰지 않는 것으로 나타났습니다. 특정 명령은 범위를 재설정합니다. 즉, 각 새 호스트 행에 "이전 행은 이전 호스트에 대한 것이고 다음 행은이 새 호스트에 대한 것"이라고 표시됩니다. 외부 회전하는 Match호스트와 동일한 전력을 "리셋 범위"를 갖는다. 이를 설명하기 위해 호스트 라인을 교체 Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"하고 로컬 네트워크의 모든 사용자 정의 값을 정의했습니다. 그런 다음 제외 !exec하고 일치하는 줄을 추가하고 네트워크를 사용하지 않을 때의 모든 값을 추가했습니다. 이제 모든 호스트에서 제대로 작동합니다.
코리 오그 번

2

나는 이런 식으로 사용하고 있습니다.

Match host mycomputer exec "nc -G 1 -z 192.168.1.11 %p"
    HostName 192.168.1.11
Match host mycomputer # fallback
    HostName my.no-ip.dynamic
Host mycomputer
    # ... other configs

Host not-my-computer
# ... other configs

ssh_config에는 들여 쓰기 블록과 같은 것이 없습니다. 일치 문장을 특정 호스트로 제한하려면 전체 조건을 설명해야합니다.

옵션 (연결 시간 종료 1 초) nc을 지정하여 오래 기다리지 않고 -G 1다음 동작을 여러 번 호출하지 않아도됩니다.nc

일치
조건부 블록을 소개합니다. 일치 줄의 모든 기준이 충족되면 다음 줄의 키워드는 다른 일치 줄 또는 파일 끝까지 구성 파일의 전역 섹션에 설정된 키워드보다 우선합니다. 키워드가 충족 된 여러 개의 일치 블록에 키워드가 나타나면 첫 번째 키워드 만 적용됩니다.

https://www.freebsd.org/cgi/man.cgi?sshd_config(5)


1

아니; HostName하나의 Host항목에 여러 개의를 지정 하면 첫 번째 항목 만 승인됩니다.

$ grep -A5 Host .ssh/config
Host test
   HostName fake.tld.xyzzy
   HostName real.example.com
   HostName 127.1.2.3
   User username
$ ssh test
ssh: Could not resolve hostname fake.tld.xyzzy: Name or service not known

말이되는 것 같아요. 내가 입력하면 ssh mycomputer어떤 컴퓨터에 연결하고 있는지 분명해야합니다.
코리 오그 번
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.