Windows CMD“或”符号(“||”)有时不起作用

Windows CMD“或”符号(“||”)有时不起作用

我在我的 Windows 10 笔记本电脑上编写了一个批处理脚本(我习惯使用 Bash 脚本,因此这可能是一个简单的 cmd 脚本答案),无论我在哪里,它都会通过 ssh 进入我家里的 Ubuntu Server 20.04.3,它看起来像这样:

@echo off
ssh -o ConnectTimeout=3 [email protected] 2>NUL || ssh root@myhomeip
pause

现在通常可以正常工作,但当我在家时,它使用第一个命令进行连接(设置连接超时,这样如果我不在家,它就不会尝试连接私有 IP 地址太长时间,一段时间前无法使用 netbios 名称,所以我将其更改为此。错误重定向,这样在尝试公共 IP 地址之前,它不会给我一些无用的错误消息),它会连接并为我提供一个会话,但当我退出时,每隔一段时间它就会立即使用第二个命令让我重新登录,尽管有“或”符号(||)。每次都使用公共地址就没问题了,但当我实际在家庭网络上时,使用公共 IP 进行连接是ssh -o ConnectTimeout=3 [email protected] 2>NUL轻微地比使用私有 IP 慢,这就是我首先编写此脚本的原因。我相信这种情况发生是因为 ssh 偶尔会因某种原因以错误状态退出,这会触发第二条命令的执行,即使我已经登录并退出了服务器。我想知道为什么会这样以及如何修复它。


这是我的第一个问题,因此请原谅任何错误或其他不便。

答案1

我相信这是因为ssh偶尔会因为某种原因以错误状态退出

交互式 shell 以Ctrl+结束cexitlogout以 shell 中执行的最后一个命令的退出状态退出。在您的情况下,shell 是远程的,如果本地ssh本身没有问题ssh,则会在本地重复远程退出状态。您谈论的原因是 shell 中的最后一个命令;它显然失败了,并且其非零退出状态传播到了本地。

可能的解决方案:

  • 总是exit 0logout 0手动(不方便)。

  • trap … EXIT在远程shell中使用并exit 0在陷阱中执行(繁琐)。

  • exit 0作为最后一个命令放入.bash_logout或等效脚本中。这特定于您在远程端使用的 shell,某些 shell 不提供此功能。脚本中的代码可能是有条件的(检查父进程是否sshd;或检查SSH_CONNECTION变量是否在环境中)。

  • 而不是使用:ssh -o ConnectTimeout=3 [email protected]

    ssh -t -o ConnectTimeout=3 [email protected] '"$SHELL"; exit 0'
    

    缺点:

    • 远端有两个嵌套的 shell;
    • 您的远程 shell 可能会在从 调用时修改其行为sshd;在这种情况下,外壳将执行此操作,但内壳不会,这可能会导致整个设置的行为不完全符合您的期望。
  • 检查(本地)的实际退出状态;如果发生错误,ssh它将是。您需要用一些逻辑来替换,以区别于任何其他退出状态。我无法可靠地为您编写这个,因为我不太了解。我255||255cmd.exe猜测它会像if ERRORLEVEL 255 ssh …

    注意,如果远程 shell 返回,255那么它将使你的本地代码认为ssh失败。没有简单的方法可以避免这种情况。尽管如此255如果我是你,我会选择测试解决方案。我实际上在我的尝试多个连接参数的 SSH 包装器

相关内容