我已经在我的 Windows 10 笔记本电脑上编写了一个批处理脚本(我习惯于 bash 脚本,所以这可能是一个简单的 cmd 脚本答案),无论我身在何处,都可以通过 ssh 进入我的 Ubuntu Server 20.04.3,它看起来像这个:
@echo off
ssh -o ConnectTimeout=3 [email protected] 2>NUL || ssh root@myhomeip
pause
现在这通常有效,但是当我实际上在家时,它使用第一个ssh -o ConnectTimeout=3 [email protected] 2>NUL
连接(连接超时设置,因此如果我不在家,它不会尝试太长时间连接到私有 IP 地址,不工作前段时间使用netbios名称,所以我将其更改为此。错误重定向,因此在尝试公共IP地址之前它不会给我一些无用的错误消息),它连接并给我一个会话,但是当我退出时,每一次尽管有“或”符号(||),但它会立即使用第二个命令让我重新登录。每次只使用公共地址就可以了,除了当我实际上在我的家庭网络上时,与公共 ip 的连接稍微有点比使用私有 ip 慢,这就是我首先制作这个脚本的原因。我相信这种情况正在发生,因为 ssh 出于某种原因偶尔会以错误状态退出,即使我已经登录和退出服务器,这也会触发执行第二个命令。我想知道为什么会这样以及如何解决它。
这是我的第一个问题,所以请原谅任何错误或其他不便。
Ctrl交互式 shell 以+终止c,
exit
或logout
以在 shell 中执行的最后一个命令的退出状态退出。在您的情况下,shell 是远程的,如果本地ssh
本身没有问题,那么ssh
将在本地重复远程退出状态。您谈论的原因是shell中的最后一个命令;它显然失败了,并且它的非零退出状态传播到了本地。可能的解决方案:
总是
exit 0
或logout 0
手动(不方便)。trap … EXIT
在远程 shell中使用并exit 0
在陷阱中执行(繁琐)。exit 0
作为最后一个命令放入或.bash_logout
等效脚本中。这是特定于您在远程端使用的 shell,某些 shell 不提供此功能。脚本中的代码可能是有条件的(检查父进程是否为sshd
; 或检查SSH_CONNECTION
变量是否在环境中)。而不是
ssh -o ConnectTimeout=3 [email protected]
使用:缺点:
sshd
;在这种情况下,外壳会这样做,但内壳不会,这可能会导致整个设置的行为不完全符合您的意愿。检查
ssh
(本地)的实际退出状态;255
如果发生错误,它将是。您需要用一些与任何其他退出状态||
区分开来的逻辑替换。255
我不能可靠地为你写这个,因为我知道cmd.exe
得不够好。我想它会像if ERRORLEVEL 255 ssh …
.请注意,如果远程 shell 返回
255
,那么它会使您的本地代码认为ssh
失败。没有简单的方法可以避免这种情况。尽管如此,如果我是你,测试255
是我会选择的解决方案。我实际上是在尝试几个连接参数的 SSH 包装器中执行此操作。