Как создать bash-скрипт для проверки SSH-соединения?
-
05-07-2019 - |
Вопрос
Я нахожусь в процессе создания bash-скрипта, который будет входить в систему на удаленных компьютерах и создавать закрытые и открытые ключи.
Моя проблема в том, что удаленные машины не очень надежны, и они не всегда работают.Мне нужен bash-скрипт, который проверял бы, подключено ли SSH-соединение.Перед фактическим созданием ключей для дальнейшего использования.
Решение
Вы можете проверить это с помощью возвращаемого значения, которое выдает вам ssh:
$ ssh -q user@downhost exit
$ echo $?
255
$ ssh -q user@uphost exit
$ echo $?
0
Редактировать:Другим подходом было бы использование nmap (вам не нужно будет иметь ключи или логин).:
$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`
$ echo $a
22/tcp open ssh
$ echo $b
(empty string)
Но вам придется обработать сообщение grep (nmap не использует возвращаемое значение, чтобы показать, был ли порт отфильтрован, закрыт или открыт).
РЕДАКТИРОВАТЬ 2:
Если вас интересует фактическое состояние ssh-порта, вы можете заменить grep open
с egrep 'open|closed|filtered'
:
$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
Просто для того, чтобы быть завершенным.
Другие советы
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
Вы можете использовать что-то вроде этого
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
Это выведет "ok" если SSH-соединение в порядке
Дополнение ответа @ Adri & # 224; Cidre
вы можете сделать:
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
if [[ $status == ok ]] ; then
echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
echo no_auth
else
echo other_error
fi
Попробуй:
echo quit | telnet IP 22 2>/dev/null | grep Connected
На тот случай, если кто-то захочет проверить, открыт ли порт 22 на удаленном компьютере, эта простая команда netcat полезна. Я использовал его, потому что nmap и telnet были недоступны для меня. Более того, моя конфигурация ssh использует аутентификацию пароля клавиатуры.
Это вариант решения, предложенного GUESSWHOz.
nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"
Если вы хотите проверить, существует ли удаленная папка или действительно какой-либо другой файл-тест:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
Не забудьте про кавычки в " $ (ssh ...) "
.
Для подключения к серверу с несколькими интерфейсами
ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51
Пример использования скрипта BASH 4+:
# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)
# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
echo "It's Open! Let's SSH to it.."
else
echo "The host ${ip} is not accessible!"
fi
Я чувствую, что вы пытаетесь решить не ту проблему здесь. Разве вы не должны пытаться сделать ssh-демоны более стабильными? Попробуйте запустить что-то вроде monit , которое проверит, работает ли демон, и перезапустит его, если это не так. t (давая вам время найти основную проблему при выключении sshd). Или обслуживание сети хлопотно? Попробуйте посмотреть на man ifup
. Разве вся эта чертова штука нравится закрывать тебя? Ну, это большая проблема ... попробуйте просмотреть ваши журналы (начните с syslog), чтобы найти аппаратные сбои или службы, которые отключают ваш бокс (возможно, монитор температуры?).
Делать ваши сценарии отказоустойчивыми - это замечательно, но вы также можете сделать свой отказоустойчивым boxen.