"Match exec" 명령이 0을 반환하지 않으면 OpenSSH를 종료합니다.

"Match exec" 명령이 0을 반환하지 않으면 OpenSSH를 종료합니다.

Match exec연결이 설정되면 SSH 기능을 사용하여 스크립트를 트리거합니다. 예를 들면 다음과 같습니다.

Match host foo* exec "/some/script.sh"

Host foo
 User ubuntu
 [... rest of ssh config file truncated ...]

/some/script.sh내가 직면한 문제는 exec( 이 경우) 로 호출된 스크립트의 종료 코드에 관계없이 ssh가 모든 연결을 계속한다는 것입니다 .

스크립트가 0이 아닌 코드로 종료되는 경우 모든 것을 중지하도록 할 수 있는 방법이 있습니까(ssh 연결을 계속하지 않음)?

답변1

참고: 스크립트의 효과가 알려진 경우 연결을 차단하는 것 외에 다른 가능성이 있을 수 있습니다. 예를 들어, 스크립트가 랩톱이 현재 특정 네트워크를 사용하고 있는지 여부를 확인하려는 경우 ProxyJump연결을 끊는 대신 중간 서버를 사용하여 연결할 수 있습니다.


스크립트가 실패할 때 0이 아닌 값으로 종료한다고 가정하면, !스크립트가 실패할 때 연결이 실패하도록 하는 활성화 구성을 사용하여 스크립트의 반환 조건을 되돌릴 수 있습니다(물론 스크립트의 종료 코드를 되돌릴 수도 있습니다). 그러면 Match해당 줄 아래의 매개변수는 스크립트가 실패한 경우에만 사용됩니다.

Match host foo* exec "! /some/script.sh"
    ... some settings to derail the connection: see below ...

Host foo
 User ubuntu
 [... rest of ssh config file truncated ...]

연결을 구체적으로 차단하는 옵션은 모르지만 특정 매개변수를 사용하여 연결을 파괴할 수 있습니다.

연결 실패를 보장하는 모든 매개변수를 사용할 수 있습니다. 일부 기능은 운영 체제에 따라 다를 수 있습니다. ... some settings to derail the connection: see below ...실패한 연결을 대체하기 위한 몇 가지 예제 라인은 다음과 같습니다 .

  • 대체 주소와 포트를 사용 Hostname 127.0.0.1하고 Port xxxx수신 대기 없이 어딘가에 연결되어 있는지 확인하세요.

    Hostname 127.0.0.1
    Port 2345
    

    스크립트가 실패한 경우에만 다음을 얻습니다.

    $ ssh foo
    ssh: connect to host 127.0.0.1 port 2345: Connection refused
    
    • 루트 액세스 권한이 있는 사람은 이에 대해 실패한 IP 주소를 지정할 수 있습니다(포트를 변경할 필요 없음).

      Linux에서 루트로 실행하는 예:

      ip route add unreachable 192.0.2.2/32
      

      그럼 그냥:

      Hostname 192.0.2.2
      

      주다:

      $ ssh foo
      ssh: connect to host 192.0.2.2 port 22: No route to host
      
  • (Linux) lo인터페이스에 바인딩하면 라우팅이 실패합니다.

    BindInterface lo
    

    주다:

    $ ssh foo
    ssh: connect to host foo port 22: Invalid argument
    

    그러나 이는 ssh 자체를 방지하지는 않습니다(예: foo시스템 자체 주소인 경우).

  • 알 수없는 호스트

    GlobalKnownHostsFile /dev/null
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking yes
    ConnectTimeout 1
    

    계속해서 연결을 시도하지만 호스트에서 제공한 지문을 찾을 수 없기 때문에 실패합니다.

    $ ssh foo
    No ECDSA host key is known for foo and you have requested strict checking.
    Host key verification failed.
    

    물론 스크립트 실패가 연결 문제와 관련된 경우에는 이것만으로는 충분하지 않지만 시간 초과를 통해 이를 완화할 수 있으며 단 1초 후에 다음과 같은 결과를 얻을 수 있습니다.

    $ ssh foo
    ssh: connect to host foo port 22: Connection timed out
    

관련 정보