매초 내 서버에 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