我希望我的终端屏幕上有一个 while 循环,每秒尝试 ssh 进入我的服务器。目前它看起来像这样:
while true; do echo INTERNALIP && date >> $HOME/server.log &&\
ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
date;\
sleep 1; done
我有一个类似的 bashwhile
循环,用于通过 ssh 进入同一台机器,但使用外部 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]
我的理解是,只有当 ssh 到 192.168.1.10 失败时才会触发第二个 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 来跟踪应该使用哪个服务器。
PS:你也许会用这个来代替:
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