Frage

Ich bin in dem Prozess einen Bash-Skript zu erstellen, die in die entfernten Computer anmelden würden und private und öffentliche Schlüssel erstellen.

Mein Problem ist, dass die Remote-Maschinen nicht sehr zuverlässig sind, und sie sind nicht immer auf. Ich brauche einen Bash-Skript, das überprüfen würde, wenn die SSH-Verbindung besteht. Bevor tatsächlich die Schlüssel für die zukünftige Verwendung zu schaffen.

War es hilfreich?

Lösung

Sie können dies mit dem Rückgabewert ssh gibt Ihnen:

$ ssh -q user@downhost exit
$ echo $?
255

$ ssh -q user@uphost exit
$ echo $?
0

EDIT: Ein anderer Ansatz wäre nmap zu verwenden (Sie werden keine Schlüssel haben müssen oder login-Material):

$ 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)

Aber Sie werden die Nachricht grep müssen (nmap nicht den Rückgabewert nicht verwendet zu zeigen, wenn ein Port gefiltert wurde, geschlossen oder offen).

EDIT2:

Wenn Sie in dem Ist-Zustand des ssh-Port interessiert sind, können Sie ersetzen grep open mit egrep 'open|closed|filtered':

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

Nur um vollständig.

Andere Tipps

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

Sie können so etwas wie diese verwenden

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

Dies wird Ausgang "ok", wenn SSH-Verbindung ist ok

, um die Reaktion von @Adrià Cidre Ergänzend können Sie tun:

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

Versuchen:

echo quit | telnet IP 22 2>/dev/null | grep Connected

Nur für den Fall, dass jemand nur überprüfen möchte, ob Port 22 auf einem entfernten Rechner geöffnet ist, diese einfache netcat Befehl ist hilfreich. Ich benutzte es, weil nmap und Telnet für mich nicht verfügbar waren. Außerdem meine ssh-Konfiguration verwendet Tastatur Kennwort Auth.

Es ist eine Variante der Lösung von GUESSWHOz vorgeschlagen.

nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"

Wenn Sie möchten, dass ein Remote-Ordner vorhanden ist, um zu überprüfen, oder jede andere Datei-Test wirklich:

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

Vergessen Sie nicht, die Zitate in "$(ssh ...)".

zu einem Server mit mehreren Schnittstellen verbinden

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

Beispiel für die Verwendung BASH 4+ Skript:

# -- 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

Ich fühle mich wie Sie versuchen, das falsche Problem hier zu lösen. Sollten Sie nicht die SSH-Daemons stabiler zu machen versuchen zu? Versuchen Sie, so etwas wie monit , die, wenn der Dämon sehen überprüfen läuft, und starten Sie es, wenn es isn t (so dass Sie Zeit das eigentliche Problem hinter sshd zu finden auf Sie heruntergefahren). Oder ist der Netzwerkdienst lästig? Versuchen Sie, bei man ifup suchen. Ist das ganze verdammte Zeug wie auf Sie herunterfahren? Nun, das ist ein größeres Problem ... versuchen auf Ihre Protokolle suchen (mit syslog Start) Hardware-Ausfälle oder Dienstleistungen zu finden, die Ihre boxen werden heruntergefahren (vielleicht eine Temperatur überwachen?).

Erstellen der Skripte fehlertolerant ist groß, aber Sie können auch Ihre boxen fehlertolerant machen wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top