我的 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/