如何运行 ssh 命令直到成功?

Phi*_*ide 42 scripting ssh watch

有时我会重新启动设备,并需要ssh在设备准备就绪后重新启动。

我想每 5 秒运行一次 ssh 命令,直到命令成功。

我的第一次尝试:

watch -n5 ssh me@device.local && exit 1
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Hun*_*son 42

另一种选择是使用until.

until ssh me@device.local; do
    sleep 5
done
Run Code Online (Sandbox Code Playgroud)

如果您对多个主机重复执行此操作,请将其放在~/.bashrc.

repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
    sleep 5
done
}
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,如果连接外部的某些东西终止了会话,则在成功连接后,`ssh` 可以以非零状态退出,在这种情况下,脚本将尝试重新连接。这可能是也可能不是理想的副作用。 (16认同)

GAD*_*D3R 27

ssh me@device.local
until !!; do sleep 5 ; done
Run Code Online (Sandbox Code Playgroud)

!!重复最后命令。

  • 创造性地使用shell历史!+1 (6认同)

Dav*_*ter 23

OpenSSH 的ConnectionAttempts设置几乎可以满足您的需求。默认值为 1,但您可以ssh_config在命令行中或在命令行上更改它:

ssh -o 'ConnectionAttempts 10' ...
Run Code Online (Sandbox Code Playgroud)

不幸的是,您无法调整固定为 1 秒的尝试间隔,但您可以ConnectTimeout以相同的方式调整连接尝试超时(以秒为单位)。


Dop*_*oti 15

while ! ssh user@host.example.com true; do
    sleep 5
done; echo "Host is back up at $(date)!"
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果您不想在服务启动之前实际登录,则`while !nc -w5 -z host.example.com 22; 做[...]`。 (2认同)

Nob*_*ody 5

autossh使 ssh 会话保持活动状态。使用正确的参数,您还可以在当前无法连接时启动它,它会尝试直到成功为止。这工作正常,但如果您希望重新连接部分能够与交互式会话很好地配合,您需要将其与screen或等效项结合起来。

我推荐这个:

AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@host
Run Code Online (Sandbox Code Playgroud)

但请参阅其手册页了解详细信息。使用上述参数,autossh将尝试每秒启动 ssh AUTOSSH_POLLAUTOSSH_GATETIME=0如果第一次尝试失败则再次尝试(所以绝对是您想要的),-M 0禁用 autossh 的连接检查,所有后续选项都传递给 ssh。-o如果连接断开超过 5 秒,这两个选项会使 ssh 退出。