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

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

집에 없을 때 홈 네트워크에 있는 컴퓨터에 SSH를 통해 연결할 수 있도록 SSH 및 라우터 포트 전달을 설정했습니다. 현재 내 파일에는 두 개의 항목이 있습니다. .ssh/config하나는 홈 네트워크에 있을 때를 위한 항목이고 다른 하나는 홈 네트워크에 없을 때를 위한 항목입니다.

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

이것은 효과가 있지만 나 자신이 일을 더 쉽게 만들 수 있는지 궁금합니다. 첫 번째 호스트 이름 항목이 실패하면 두 번째 호스트 이름 항목으로 대체되도록 여러 호스트 이름 항목을 나열하는 방법이 있었으면 좋겠습니다.

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

이렇게 하면 먼저 내 로컬 네트워크의 호스트에 연결을 시도하고 해당 호스트가 존재하지 않으면 IP가 없는 동적 호스트 이름을 사용하여 연결을 시도합니다. 두 호스트 이름을 모두 입력하려고 시도했지만 ssh mycomputer아무것도 수행하지 못하도록 차단만 실행했습니다.

키를 사용하기 위해 비밀번호 인증을 꺼두었기 때문에 홈 네트워크에 있지 않을 때 실수로 로컬 네트워크에 있는 컴퓨터에 연결하면 비밀번호가 작동하지 않습니다.

첫 번째 호스트 이름이 작동하지 않는 경우 시도할 대체 호스트 이름을 지정할 수 있습니까?

답변1

비록 못생겼지만 내 생각에는할 수 있다이를 수행하려면 포트 노킹에 대한 종료 상태 기준을 사용하십시오 exec.Match

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 세그먼트에 있다는 것입니다.

답변2

그게 내가 사용하는 방법이야

Match host mycomputer exec "nc -w 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에는 들여쓰기된 블록과 같은 것이 없습니다. match 문을 특정 호스트로 제한하려면 전체 조건을 설명해야 합니다.

nc(connection timeout 1s) 옵션을 제공하여 오랜 대기 시간을 피할 수 -w 1있으며 다음 동작을 활용하여 여러 호출을 피할 수 있습니다.nc

일치에는
조건부 블록이 도입됩니다. "일치" 줄의 모든 조건이 충족되면 다음 줄의 키워드는 다른 "일치" 줄이나 파일 끝까지 구성 파일의 전역 섹션에 설정된 키워드를 재정의합니다. 조건을 충족하는 둘 이상의 일치 블록에 키워드가 나타나는 경우 해당 키워드의 첫 번째 인스턴스만 적용됩니다.

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

답변3

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

답변4

예약 된 일들:
@reboot ~/.ssh/scripts/distant_check.sh

~/.ssh/scripts/distant_check.sh:
ping -c1 [로컬 서버 IP]
만약 [ $? -eq 0 ];
cp ~/.ssh/config_local ~/.ssh/config
기타
cp ~/.ssh/config_distant ~/.ssh/config
필리핀 제도

관련 정보