내부 IP 또는 외부 IP로 SSH를 연결하는 루프 동안 한 줄짜리 bash

내부 IP 또는 외부 IP로 SSH를 연결하는 루프 동안 한 줄짜리 bash

매초 내 서버에 ssh를 시도하는 터미널 화면에 while 루프를 갖고 싶습니다. 현재는 다음과 같이 보입니다.

while true; do echo INTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
     date;\
sleep 1; done

동일한 시스템에 SSH로 연결하기 위한 비슷한 bash 루프가 있지만 while사무실 네트워크에 없을 때 연결하는 방식인 외부 IP를 사용합니다.

while true; do echo EXTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
     date;\
sleep 1; done

내가 하고 싶은 것은 이 두 가지를 하나의 단일 라이너로 통합하는 것입니다. 즉, (1) 먼저 INTERNALIP를 통해 연결을 시도하고, 실패할 경우 EXTERNALIP를 통해 연결을 시도합니다. 저는 bash의 조건문에 익숙하지 않아서 어떻게 해야 할지 잘 모르겠습니다.

어떤 아이디어가 있나요?

답변1

루프 내에서 다음 줄을 사용하면 어떨까요?

ssh [email protected] || ssh [email protected]

내가 이해하는 방식은 192.168.1.10에 대한 SSH가 실패한 경우에만 두 번째 SSH가 트리거됩니다. 그게 당신이 원하는 거 아닌가요?

SSH 옵션, 로그 등에 대한 다른 모든 세부 정보는 생략했습니다.

어쩌면 다음과 같은 것이 더 좋을 수도 있습니다.

( ssh [email protected] && echo INTERNALIP ) || ( ssh [email protected] && echo EXTERNALIP )

이것은 로그도 처리해야 하며 하나의 라이너입니다. (지금은 테스트할 기회가 없으므로 주의하세요.)

답변2

귀하의 스크립트가 귀하가 원하는 대로 정확하게 작동한다고 가정하면 다음과 같이 실행하겠습니다.

while true; do echo INTERNALIP && date >> $HOME/server.log && \
    if [ "`find .external.pid -mtime 1 | egrep '.*'`" == "" ]; then \
        ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected]; \
        if [ $? == 255 ]; then touch -d "-1 day" .external.pid; fi; \
    else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected]; \
        if [ $? == 255 ]; then rm .external.pid; fi; \
    fi; \
    date; \
sleep 1; done

이는 .external.pid를 사용하여 사용해야 하는 서버를 추적합니다.

추신: 아마도 다음을 대신 사용할 것입니다.

while true; do echo INTERNALIP && date >> $HOME/server.log && \
    if [ "`find .external.pid -atime +1s | egrep '.*'`" == "" ]; then \
        ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 -o [email protected] 'date'; \
        if [ $? == 255 ]; then touch .external.pid; fi; \
    else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected] 'date'; \
        if [ $? == 255 ]; then rm .external.pid; fi; \
    fi; \
sleep 1; done

관련 정보