Я занимаюсь созданием сценария bash, который будет входить на удаленные машины и создавать закрытые и открытые ключи.
Моя проблема в том, что удаленные машины не очень надежны и не всегда работают. Мне нужен сценарий bash, который проверяет, установлено ли соединение SSH. Перед созданием ключей для будущего использования.
bash
ssh
connection
чутсу
источник
источник
ssh-keygen
для создания пары ключей на локальном компьютере, а затемssh-copy-id
для копирования открытого ключа на удаленные машины. Кажется, ты делаешь иначе. Почему, какова твоя цель?Ответы:
Вы можете проверить это с помощью возвращаемого значения, которое дает вам 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
неработающему хосту терпит неудачу только после тайм-аута, например, 60 секунд, что может быть недопустимым для некоторых случаев использования. Кроме того, если имя хоста определено в~/.ssh/config
, первыйssh
подход работает, а второйnmap
не работает сFailed to resolve "<hostname>"
.$?
? etcssh -q user@downhost exit | echo $?
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
источник
Пытаться:
echo quit | telnet IP 22 2>/dev/null | grep Connected
источник
ssh
Команда ниже должна иметь код выхода при0
успешном соединении и ненулевое значение в противном случае.ssh -q -o BatchMode=yes user@remote.com exit if [ $? != "0" ]; then echo "Connection failed" fi
источник
На всякий случай, если кто-то только хочет проверить, открыт ли порт 22 на удаленном компьютере, полезна эта простая команда netcat. Я использовал его, потому что nmap и telnet были мне недоступны. Более того, моя конфигурация ssh использует пароль клавиатуры auth.
Это вариант решения, предложенного 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 ...)"
.источник
Для подключения к серверу с несколькими интерфейсами
источник
Пример использования сценария 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
источник
https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html
Ссылка выше предназначена для создания скрипта Python для проверки возможности подключения. Вы можете использовать аналогичный метод и использовать:
ping -w 1 -c 1 "IP Address"
Команда для создания bash-скрипта.
источник
Я чувствую, что вы пытаетесь решить не ту проблему. Разве вы не должны попытаться сделать демонов ssh более стабильными? Попробуйте запустить что-то вроде monit , которое проверит, запущен ли демон, и перезапустит его, если это не так (у вас будет время найти корень проблемы, стоящей за отключением sshd). Или сетевая услуга доставляет хлопоты? Попробуйте посмотреть
man ifup
. Неужели Whole Damn Thing просто хочет отключиться от вас? Что ж, это более серьезная проблема ... попробуйте просмотреть свои журналы (начните с системного журнала), чтобы найти сбои оборудования или службы, которые выключают ваш бокс (может быть, монитор температуры?).Сделать ваши скрипты отказоустойчивыми - это здорово, но вы также можете сделать отказоустойчивым свой бокс.
источник