1

Мне нужно подождать, пока целевой хост не будет запущен и не будет принимать соединения через определенный порт.

Я хочу использовать это как часть команды ssh -o ProxyCommand чтобы дождаться загрузки целевого хоста и запуска sshd, прежде чем nc наконец подключится к нему.

Как я могу сделать это в Linux?

2 ответа2

2

Вы можете использовать Nmap для этого. Следующая команда попытается установить TCP-соединение с 22 портом (SSH) и вернет следующее в случае успеха:

$ nmap -sT -p 22 <host>
Starting Nmap 6.47 ( http://nmap.org ) at 2016-06-02 12:40 CEST
Nmap scan report for <host> (<ip>)
Host is up (0.00078s latency).
PORT   STATE SERVICE
22/tcp open  ssh

Когда хост не отвечает, вы получаете следующее:

$ nmap -sT -p 22 <host>

Starting Nmap 6.47 ( http://nmap.org ) at 2016-06-02 12:40 CEST
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 1.04 seconds

Вы также можете добавить следующие параметры, чтобы избежать слишком долгого ожидания, пока хост не отвечает:

$ nmap -sT -p 22 <host> --max-retries 1 --host-timeout 1

Если вы поместите эту команду в скрипт с циклом while и таймером сна, вы можете получить ожидаемый результат. Что-то вроде этого:

while true
do
  nmap -sT -p 22 <host> --max-retries 1 --host-timeout 1 | grep open > /dev/null
  if [ $? -eq 0 ]
  then
    echo "Your host is ready"
    exit 0
  fi
  sleep 1
done
0

Попробуйте подключиться в цикле:

COUNT=0; 
until ssh $user@$ip || [ $COUNT -eq 10 ]; do sleep 1; (( COUNT++ )); done

Цикл завершится после 10 попыток или после установления соединения ssh.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .