Как проверить подключение к списку серверов в bash? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь проверить соединения для списка серверов. Я хочу просмотреть список, проверить, работает ли соединение, и если да, сделать что-нибудь, если нет, вывести сообщение о проблеме.

Моя проблема:
скрипт останавливается на первом узле, не отображая $ ?. Итак, что не так с моим циклом for?

Эти переменные включены в конфигурационный файл:
$nodes - это список IP-адресов серверов, например 1.1.1.1,2.2.2.2,10.10.10.10
$user это одна строка

for node in $(echo $nodes | sed "s/,/ /g")
    do
    echo "Checking Node: $node"

    ssh -q -o ConnectTimeout=3 $user@$node echo ok
    echo $?
    if [[ $? != 0 ]]
    then
        echo "Problem in logging into $node"
    else
        # do some stuff here
    fi
done

РЕДАКТИРОВАТЬ # 1:

for node in $(echo $nodes | sed "s/,/ /g")
    do
    echo "Checking Node: $node"

    ssh -q -t -o ConnectTimeout=3 $user@$node "echo ok"
    retcode=$?
    echo $retcode
    if [[ "$retcode" -ne 0 ]]
    then
        echo "Problem in logging into $node"
    else
        echo "OK"
    fi
done

Ответы [ 2 ]

0 голосов
/ 09 января 2019

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

Если вы просто хотите проверить ssh-соединение, вы можете использовать

telnet <your_host> <port> < /dev/null

Но если вы намерены выполнить несколько команд, вам нужны доверительные отношения между хостами. В этом случае вы можете использовать:

Выполнить следующие команды:

ssh-keygen -t rsa

тогда

ssh-copy-id -i root@ip_address

Теперь вы можете соединиться с

ssh <user>@<host>

Дополнительная информация

0 голосов
/ 09 января 2019

Вы можете добавить -t, чтобы создать виртуальный терминал, и добавить кавычки по команде:

ssh -q -t -o ConnectTimeout=3 ${user}@${node} "echo ok"

Также используйте -ne вместо !=, который предназначен для сравнения строк

if [[ "$?" -ne 0 ]]

Также echo $? испортит код возврата. Вы должны использовать что-то вроде:

ssh -q -t -o ConnectTimeout=3 ${user}@${node} "echo ok"
retcode=$?
echo $retcode
if [[ "$retcode" -ne 0 ]]

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

ssh -q -t -o StrictHostKeyChecking=no -o ConnectTimeout=3 ${user}@${node} "echo ok"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...