Скрипт для проверки работоспособности службы SSH в Docker - PullRequest
0 голосов
/ 08 октября 2018

Мой Docker-контейнер имеет две службы: веб-службу и сервер SSH.

Сервер SSH является openssh-сервером, и мне нужно запустить команду 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

Любые комментарии или идеи приветствуются.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Если 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

Возможно, вы захотитедобавить некоторые задержки сна, чтобы избежать перезапусков.Может быть, серверу ssh просто нужно некоторое время, чтобы принять соединения после перезапуска.

0 голосов
/ 08 октября 2018

Чтобы проверить соединение ssh, мы можем использовать пакет sshpass, чтобы ввести пароль в командной строке.

while : ; do
    docker exec -it my-container sudo service ssh restart
    sleep 5s
    sshpass -p 'root' ssh -q root@localhost -p 2222 exit
    if [ $? == 0 ]; then
            echo "SSH server is running."
            break
    fi
    echo "SSH server is not running. Restarting..."
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...