bash - 检查 Docker 中的 SSH 服务是否启动的脚本

标签 bash shell docker ssh sh

我的 docker 容器有两个服务:一个 Web 服务和一个 SSH 服务器。

SSH服务器是openssh-server,我需要运行命令docker exec -it my-container sudo service ssh restart从容器外部启动 SSH 服务器。

但是,该命令并不总是成功。每次我需要使用以下命令手动检查容器中的 SSH 服务器是否已启动:ssh root@localhost :

1)如果SSH服务器启动失败,结果为ssh_exchange_identification: Connection closed by remote host
2) 否则,它会要求输入密码。 (这表明SSH服务器已启动)

由于我要同时部署多个容器,手动检查每个容器是不现实的。因此,我想重试 docker exec -it my-container sudo service ssh restart如果 SSH 服务无法启动,命令会自动启动。但我不确定如何编写 bash 脚本来实现这一点。它基本上应该像这样工作:

while (ssh_server_fails_to_start):
    docker exec -it my-container sudo service ssh restart

任何意见或想法表示赞赏。提前致谢!

最佳答案

如果 sshd正在运行,它将接受其特定端口上的连接。否则,连接尝试将失败。

如果您运行以下命令:

ssh -o PasswordAuthentication=No root@localhost true

这将以任何一种方式失败,但输出会有所不同。在服务器正在运行并接受连接的情况下,显式关闭密码身份验证将使其失败并显示以下消息:
Permission denied (publickey,password).

否则它将打印出如下消息:
ssh: connect to host localhost port 22: Connection refused

所以我建议扫描错误消息以获取如下提示:
if ssh -o PasswordAuthentication=No root@localhost true \
     |& grep -q "Connection refused"
then
    echo "No server reachable!"
else
    echo "Server reachable."
fi

所以你可以这样写你的脚本:
while ssh -o PasswordAuthentication=No root@localhost true \
        |& grep -q "Connection refused"
do
  docker exec -it my-container sudo service ssh restart
done

您可能需要添加一些 sleep 延迟以避免仓促重启。也许 ssh 服务器在重新启动后只需要一些时间来接受连接。

关于bash - 检查 Docker 中的 SSH 服务是否启动的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708057/

相关文章:

ruby - Linux 服务器 sudo 命令未找到

bash - bash 中 ${foo :? } 中的 "?"是什么意思?

linux - ZSH 中参数的历史搜索

android - Docker找不到Android SDK和NDK目录

php - 使用 PHP 库进行 FFMPEG 音频合并

bash - Linux 狂欢 : while loop can't loop through file (where lines are divided by\r\n)

python - 如何在Python中获取实际的shell提示符字符串?

linux - 如何列出包含文件的所有子目录

node.js - 具有特定 Node 版本的Docker镜像

python - Docker中的 Airflow initdb引发ImportError:无法导入名称 'import_string'