it-swarm.com.de

Wie erstelle ich ein Bash-Skript, um die SSH-Verbindung zu überprüfen?

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.

61
chutsu

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.

119
user156676
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
19
Brian Ott

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

14
Adrià Cidre

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
6
iarroyo

Versuchen:

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

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 ...)".

0
Sheljohn

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
0
Mike Q

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.

0
Dheeraj Kumar

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]
0
neckTwi

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"
0
Mathieu C.