Как создать bash-скрипт для проверки SSH-соединения? - PullRequest
69 голосов
/ 10 сентября 2009

Я нахожусь в процессе создания bash-скрипта, который будет входить на удаленные машины и создавать закрытые и открытые ключи.

Моя проблема в том, что удаленные машины не очень надежны и не всегда работают. Мне нужен скрипт bash, который бы проверял, работает ли соединение SSH. Перед созданием ключей для будущего использования.

Ответы [ 10 ]

130 голосов
/ 10 сентября 2009

Вы можете проверить это с помощью возвращаемого значения, которое дает 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)

Но вы должны будете просмотреть сообщение (nmap не использует возвращаемое значение, чтобы показать, был ли порт фильтрован, закрыт или открыт).

EDIT2:

Если вас интересует фактическое состояние ssh-порта, вы можете заменить grep open на egrep 'open|closed|filtered':

$ nmap host -PN -p ssh | egrep 'open|closed|filtered'

Просто чтобы быть полным.

19 голосов
/ 19 июля 2012
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
14 голосов
/ 13 августа 2013

Вы можете использовать что-то вроде этого

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

Это выведет "ok", если с ssh-подключением все в порядке

7 голосов
/ 22 октября 2015

Дополняя ответ @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
3 голосов
/ 23 апреля 2010

Попробуйте:

echo quit | telnet IP 22 2>/dev/null | grep Connected
0 голосов
/ 06 мая 2019

Пример использования скрипта 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
0 голосов
/ 10 февраля 2019

Для подключения к серверу с несколькими интерфейсами

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51
0 голосов
/ 17 июля 2018

Если вы хотите проверить, существует ли удаленная папка или какой-либо другой файл-тест на самом деле:

if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
    # exists
else
    # doesn't exist
fi

Не забудьте про цитаты в "$(ssh ...)".

0 голосов
/ 23 марта 2018

На тот случай, если кто-то захочет проверить, открыт ли порт 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"
0 голосов
/ 13 сентября 2009

Я чувствую, что вы пытаетесь решить не ту проблему здесь. Разве вы не должны пытаться сделать ssh-демоны более стабильными? Попробуйте запустить что-то вроде monit , которое проверит, работает ли демон, и перезапустит его, если это не так (давая вам время, чтобы найти основную проблему при отключении sshd на вас). Или обслуживание сети хлопотно? Попробуйте посмотреть на man ifup. Разве вся эта чертова штука нравится закрывать тебя? Что ж, это большая проблема ... попробуйте просмотреть ваши журналы (начните с syslog), чтобы найти аппаратные сбои или службы, которые отключают ваш бокс (возможно, монитор температуры?).

Делать ваши скрипты отказоустойчивыми - это здорово, но вы также можете сделать свой бокс отказоустойчивым.

...