Как создать bash-скрипт для проверки SSH-соединения?

StackOverflow https://stackoverflow.com/questions/1405324

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top