GNU/Linux >> Znalost Linux >  >> Linux

Příkaz Linuxu, který čeká na spuštění serveru SSH

Řešení 1:

Nemám hostitele, ke kterému bych mohl ssh a ovládat, zda je zapnutý nebo ne, ale mělo by to fungovat:

while ! ssh <ip>
do
    echo "Trying again..."
done

Nebo skript shellu, který je explicitnější:

#!/bin/sh

ssh $1
while test $? -gt 0
do
   sleep 5 # highly recommended - if it's in your local network, it can try an awful lot pretty quick...
   echo "Trying again..."
   ssh $1
done

Uložte jej jako (řekněme) waitforssh.sh a poté jej zavolejte pomocí sh waitforssh.sh 192.168.2.38

Řešení 2:

Něco jednoduchého, jako je toto, dělá svou práci, čeká 5 sekund mezi pokusy a zahodí STDERR

until ssh <host> 2> /dev/null
  do
    sleep 5
  done

Řešení 3:

function hurryup () { 
    until ssh -o ConnectTimeout=2 "$1"@"$2"
        do sleep 1
    done
}
hurryup root "10.10.0.3"

-o ConnectTimeout=2 je trochu otřepaný způsob, jak obejít nereagování na síťové pakety, hlášení ssh: connect to host 10.10.0.3 port 22: Operation timed out dokud nebude reagovat.

Poté, když hostitel odpoví na síťové pakety, dojde k 1 sekundovému spánku mezi ssh: connect to host 10.10.0.3 port 22: Connection refused když čekáme, až se objeví ssh.

Řešení 4:

Toto je skript 'ping_ssh', který používám. Zvládá případy vypršení časového limitu, rychlý úspěch a nebude vyžadovat hesla ani se nenechá zmást tím, že je port otevřený, ale nereaguje jako u řešení založených na „nc“. Toto kombinuje několik odpovědí nalezených na různých stránkách souvisejících se stackoverflow.

#!/usr/bin/bash
HOST=$1
PORT=$2
#HOST="localhost"
#PORT=8022
if [ -z "$1" ]
  then
    echo "Missing argument for host."
    exit 1 
fi

if [ -z "$2" ]
  then
    echo "Missing argument for port."
    exit 1 
fi
echo "polling to see that host is up and ready"
RESULT=1 # 0 upon success
TIMEOUT=30 # number of iterations (5 minutes?)
while :; do 
    echo "waiting for server ping ..."
    # https://serverfault.com/questions/152795/linux-command-to-wait-for-a-ssh-server-to-be-up
    # https://unix.stackexchange.com/questions/6809/how-can-i-check-that-a-remote-computer-is-online-for-ssh-script-access
    # https://stackoverflow.com/questions/1405324/how-to-create-a-bash-script-to-check-the-ssh-connection
    status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 ${HOST} -p ${PORT} echo ok 2>&1)
    RESULT=$?
    if [ $RESULT -eq 0 ]; then
        # this is not really expected unless a key lets you log in
        echo "connected ok"
        break
    fi
    if [ $RESULT -eq 255 ]; then
        # connection refused also gets you here
        if [[ $status == *"Permission denied"* ]] ; then
            # permission denied indicates the ssh link is okay
            echo "server response found"
            break
        fi
    fi
    TIMEOUT=$((TIMEOUT-1))
    if [ $TIMEOUT -eq 0 ]; then
        echo "timed out"
        # error for jenkins to see
        exit 1 
    fi
    sleep 10
done

Linux
  1. 8 tipů pro příkazový řádek Linuxu

  2. 12 Příklady IP příkazů pro uživatele Linuxu

  3. Linux killall příkaz pro začátečníky (8 příkladů)

  1. W Command v Linuxu

  2. At Command v Linuxu

  3. Linuxový příkaz dir pro začátečníky (10 příkladů)

  1. Příkaz Linux rm vysvětlený pro začátečníky (8 příkladů)

  2. Linux ln Command Tutorial pro začátečníky (5 příkladů)

  3. Linux nl Command Tutorial pro začátečníky (7 příkladů)