Как создать bash script для проверки соединения SSH?
Я создаю bash script, который будет записывать на удаленные компьютеры и создавать закрытые и открытые ключи.
Моя проблема в том, что удаленные машины не очень надежны, и они не всегда вверх. Мне нужен bash script, который проверял бы соединение SSH. Прежде чем создавать ключи для будущего использования.
Ответы
Ответ 1
Вы можете проверить это с помощью возвращаемого значения ssh:
$ ssh -q [email protected] exit
$ echo $?
255
$ ssh -q [email protected] exit
$ echo $?
0
EDIT: Еще один подход - использовать 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 не использует возвращаемое значение, чтобы показать, был ли порт фильтром, закрыт или открыт).
EDIT2:
Если вас интересует фактическое состояние ssh-порта, вы можете заменить grep open
на egrep 'open|closed|filtered'
:
$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
Просто чтобы быть полным.
Ответ 2
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
Ответ 3
Вы можете использовать что-то вроде этого
$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] echo ok 2>&1)
Это приведет к выводу "ok", если ssh-соединение в порядке
Ответ 4
Дополняя ответ @Adrià Cidre
, вы можете сделать:
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] 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
Ответ 5
Try:
echo quit | telnet IP 22 2>/dev/null | grep Connected
Ответ 6
На всякий случай кто-то хочет проверить, открыт ли порт 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"
Ответ 7
Если вы хотите проверить наличие удаленной папки или любой другой файл-тест:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
Не забывайте цитаты в "$(ssh...)"
.
Ответ 8
Для подключения к серверу с несколькими интерфейсами
ssh -o ConnectTimeout=1 -q [email protected];[ $? = 1 ] || ssh -o ConnectTimeout=1 -q [email protected]
Ответ 9
Пример использования скрипта 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 Open! Let SSH to it.."
else
echo "The host ${ip} is not accessible!"
fi
Ответ 10
https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html
Выше ссылка заключается в создании скрипта Python для проверки подключения.
Вы можете использовать аналогичный метод и использовать:
ping -w 1 -c 1 "IP Address"
Команда для создания скрипта bash.
Ответ 11
Я чувствую, что вы пытаетесь решить неправильную проблему здесь. Разве вы не должны пытаться сделать демоны ssh более стабильными? Попробуйте запустить что-то вроде monit, в котором будет проверяться, запущен ли демон и перезапустить его, если это не так (дает вам время чтобы найти основную проблему, стоящую за закрытием sshd). Или это сетевая услуга? Попробуйте посмотреть man ifup
. Разве целая чертова штука просто нравится закрывать вас? Ну, это большая проблема... попробуйте просмотреть свои журналы (начните с syslog), чтобы найти аппаратные сбои или услуги, которые закрывают ваш boxen (возможно, монитор температуры?).
Уверенность в том, что ваши сценарии являются терпимыми к ошибкам, замечательно, но вы также можете сделать свою отказоустойчивость к коробке.