bash 单行 while 循环以 ssh 进入内部 IP 或外部 IP

bash 单行 while 循环以 ssh 进入内部 IP 或外部 IP

我希望我的终端屏幕上有一个 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

相关内容