Ich bin gerade dabei, ein Bash-Skript zu erstellen, das sich bei den Remote-Computern anmeldet und private und öffentliche Schlüssel erstellt.
Mein Problem ist, dass die Remote-Maschinen nicht sehr zuverlässig sind und nicht immer in Betrieb sind. Ich brauche ein Bash-Skript, das überprüft, ob die SSH-Verbindung besteht. Bevor Sie die Schlüssel für die zukünftige Verwendung erstellen.
Sie können dies mit dem Rückgabewert überprüfen, den ssh Ihnen gibt:
$ ssh -q [email protected] exit
$ echo $?
255
$ ssh -q [email protected] exit
$ echo $?
0
BEARBEITEN: Ein anderer Ansatz wäre die Verwendung von nmap (Sie brauchen keine Schlüssel oder Login-Sachen):
$ 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)
Sie müssen jedoch die Nachricht grep haben (nmap verwendet den Rückgabewert nicht, um anzuzeigen, ob ein Port gefiltert, geschlossen oder geöffnet wurde).
EDIT2:
Wenn Sie sich für den aktuellen Status des SSH-Ports interessieren, können Sie grep open
durch egrep 'open|closed|filtered'
ersetzen:
$ nmap Host -PN -p ssh | egrep 'open|closed|filtered'
Nur um vollständig zu sein.
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 verwenden
$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] echo ok 2>&1)
Dies gibt "ok" aus, wenn die ssh-Verbindung in Ordnung ist
Ergänzend zur Antwort von @Adrià Cidre
können Sie Folgendes tun:
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] 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
Wenn Sie prüfen möchten, ob ein Remote-Ordner vorhanden ist, oder wirklich einen anderen Datei-Test:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
Vergessen Sie nicht die Anführungszeichen in "$(ssh ...)"
.
Beispiel mit 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
https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-Host.html
Über dem Link wird ein Python Skript zum Überprüfen der Konnektivität erstellt. Sie können eine ähnliche Methode verwenden und verwenden:
ping -w 1 -c 1 "IP Address"
Befehl zum Erstellen eines Bash-Skripts.
So stellen Sie eine Verbindung zu einem Server mit mehreren Schnittstellen her
ssh -o ConnectTimeout=1 -q [email protected];[ $? = 1 ] || ssh -o ConnectTimeout=1 -q [email protected]
Nur für den Fall, dass jemand nur prüfen möchte, ob Port 22 auf einer Remote-Maschine offen ist, ist dieser einfache Befehl netcat hilfreich. Ich habe es benutzt, weil mir nmap und telnet nicht zur Verfügung standen. Außerdem verwendet meine SSH-Konfiguration das Kennwort für das Tastaturkennwort.
Es ist eine Variante der von GUESSWHOz vorgeschlagenen Lösung.
nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"