Jestem w trakcie tworzenia skryptu bash, który logowałby się do zdalnych maszyn i tworzył klucze prywatne i publiczne.
Mój problem polega na tym, że zdalne maszyny nie są zbyt niezawodne i nie zawsze działają. Potrzebuję skryptu bash, który sprawdziłby, czy połączenie SSH jest aktywne. Przed faktycznym utworzeniem kluczy do wykorzystania w przyszłości.
bash
ssh
connection
chutsu
źródło
źródło
ssh-keygen
aby wygenerować parę kluczy na komputerze lokalnym, a następniessh-copy-id
skopiować klucz publiczny na komputery zdalne. Wygląda na to, że robisz coś inaczej. Dlaczego, jaki jest twój cel?Odpowiedzi:
Możesz to sprawdzić za pomocą wartości zwracanej przez ssh:
$ ssh -q user@downhost exit $ echo $? 255 $ ssh -q user@uphost exit $ echo $? 0
EDYCJA: Innym podejściem byłoby użycie nmap (nie musisz mieć kluczy ani rzeczy do logowania):
$ 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)
Ale będziesz musiał grepować wiadomość (nmap nie używa wartości zwracanej do pokazania, czy port był filtrowany, zamknięty czy otwarty).
EDYCJA2:
Jeśli jesteś zainteresowany w rzeczywistym stanem ssh-portu, można zastąpić
grep open
zegrep 'open|closed|filtered'
:$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
Żeby być kompletnym.
źródło
ssh
przejścia do wyłączonego hosta kończy się niepowodzeniem dopiero po przekroczeniu limitu czasu wynoszącego np. 60 sekund - co może być przeszkodą w niektórych zastosowaniach. Ponadto, jeśli nazwa hosta jest zdefiniowana w~/.ssh/config
, pierwszessh
podejście działa, podczas gdy drugienmap
zawodziFailed to resolve "<hostname>"
.$?
? itd.ssh -q user@downhost exit | echo $?
przeprowadź połączenie w echossh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
źródło
Możesz użyć czegoś takiego
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
Spowoduje to wyświetlenie komunikatu „ok”, jeśli połączenie ssh jest prawidłowe
źródło
Uzupełnienie odpowiedzi
@Adrià Cidre
możesz zrobić: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
źródło
Próbować:
echo quit | telnet IP 22 2>/dev/null | grep Connected
źródło
Poniższe
ssh
polecenie powinno mieć kod zakończenia0
po pomyślnym połączeniu i wartość niezerową w przeciwnym razie.ssh -q -o BatchMode=yes [email protected] exit if [ $? != "0" ]; then echo "Connection failed" fi
źródło
Na wypadek, gdyby ktoś chciał tylko sprawdzić, czy port 22 jest otwarty na zdalnej maszynie, to proste polecenie netcat jest przydatne. Użyłem go, ponieważ nmap i telnet nie były dla mnie dostępne. Co więcej, moja konfiguracja ssh używa uwierzytelniania hasłem klawiatury.
Jest to wariant rozwiązania zaproponowanego przez GUESSWHOz.
nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"
źródło
Jeśli chcesz sprawdzić, czy folder zdalny istnieje, lub naprawdę przetestować inny plik:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then # exists else # doesn't exist fi
Nie zapomnij o cudzysłowach w
"$(ssh ...)"
.źródło
Aby połączyć się z serwerem z wieloma interfejsami
źródło
Przykład użycia skryptu BASH 4+:
# -- 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
źródło
https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html
Powyższy link służy do stworzenia skryptu Python do sprawdzania łączności. Możesz użyć podobnej metody i użyć:
ping -w 1 -c 1 "IP Address"
Polecenie do utworzenia skryptu bash.
źródło
Wydaje mi się, że próbujesz tutaj rozwiązać niewłaściwy problem. Nie powinieneś próbować uczynić demonów ssh bardziej stabilnymi? Spróbuj uruchomić coś takiego jak monit , który sprawdzi, czy demon działa i zrestartuje go, jeśli tak nie jest (dając ci czas na znalezienie głównego problemu związanego z zamykaniem się sshd). A może usługa sieciowa jest kłopotliwa? Spróbuj spojrzeć
man ifup
. Czy Całe Cholerne Po prostu lubi się na tobie zamknąć? Cóż, to większy problem ... spróbuj przejrzeć swoje logi (zacznij od syslog), aby znaleźć awarie sprzętu lub usługi, które wyłączają twój boxen (może monitor temperatury?).Sprawienie, by twoje skrypty były odporne na błędy, jest świetne, ale możesz też chcieć, aby twój boxen był odporny na błędy.
źródło