Wie ein Bash-Skript erstellen, um die SSH-Verbindung zu überprüfen?
-
05-07-2019 - |
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.
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.