Как создать скрипт bash для проверки SSH соединения?
Я нахожусь в процессе создания сценария bash, который будет входить в удаленные машины и создавать частные и открытые ключи.
моя проблема заключается в том, что удаленные машины не очень надежные, и они не всегда. Мне нужен скрипт bash, который проверит, работает ли SSH-соединение. Перед фактическим созданием ключей для будущего использования.
8 ответов:
вы можете проверить это с помощью возвращаемого значения ssh дает вам:
$ ssh -q user@downhost exit $ echo $? 255 $ ssh -q user@uphost exit $ echo $? 0EDIT: другой подход будет использовать 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'просто чтобы быть полным.
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à 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
на всякий случай, если кто-то только хочет проверить, открыт ли порт 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-демоны более стабильный? Попробуйте запустить что-то вроде монит, который проверит, работает ли демон и перезапустит его, если это не так (давая вам время найти корневую проблему за закрытием sshd на вас). Или сетевая служба хлопотно? Попробуйте посмотреть на
man ifup. Неужели вся эта чертова штука просто хочет закрыться от тебя? Ну, это большая проблема ... пытаться глядя на ваши журналы (начните с системного журнала), чтобы найти аппаратные сбои или службы, которые закрывают ваш boxen (возможно, монитор температуры?).сделать ваши сценарии отказоустойчивыми-это здорово, но вы также можете сделать свой boxen отказоустойчивым.
Comments