Wykonuję skrypt łączący się przez SSH bez hasła na zdalnym hoście. Chcę ustawić limit czasu, aby jeśli zdalny host działał w nieskończoność, chcę wyjść z tej sesji ssh i kontynuować inne wiersze w moim skrypcie sh.
Jeśli przekierowałeś tutaj tylko po to, aby „pozostać dłużej w sshsesji” (pytanie „Jak zwiększyć limit czasu połączenia SSH?”), To jest niewłaściwe miejsce . Odpowiedź znajduje się pod tym linkiem o ssh-timeout .
Peter Krauss,
Odpowiedzi:
288
ssh -o ConnectTimeout=10<hostName>
Gdzie 10 to czas w sekundach. Ten limit czasu dotyczy tylko tworzenia połączenia.
ConnectTimeout zapobiega zawieszaniu się skryptu, BatchMode zapobiega zawieszaniu się z nieznanym hostem, TAK, aby dodać do known_hosts, a StrictHostKeyChecking automatycznie dodaje odcisk palca.
**** UWAGA **** Funkcja „StrictHostKeyChecking” była przeznaczona tylko dla sieci wewnętrznych, w których ufasz swoim hostom. W zależności od wersji klienta SSH komunikat „Czy na pewno chcesz dodać odcisk palca” może spowodować zawieszenie się klienta na czas nieokreślony (głównie stare wersje działające w systemie AIX). Większość nowoczesnych wersji nie ma tego problemu. Jeśli masz do czynienia z odciskami palców na wielu hostach, polecam utrzymywanie pliku known_hosts za pomocą jakiegoś narzędzia do zarządzania konfiguracją, takiego jak puppet / ansible / chef / salt / etc.
Nie tylko -o StrictHostKeyChecking=nonie rozwiązuje tego pytania, ale jest to okropny pomysł, jeśli zależy Ci na bezpieczeństwie, co może być powodem, dla którego używasz SSH w pierwszej kolejności.
Dolph
9
Dobrze jest zwrócić uwagę na możliwe implikacje dla bezpieczeństwa wynikające z -o StrictHostKeyChecking = no. Jednak zapobiegnie to zawieszaniu się skryptu podczas wykonywania.
Doug,
2
OSTRZEŻENIE!!!! Jak napisał @Dolph, NIE używaj, StrictHostKeyChecking=nojeśli w ogóle zależy Ci na bezpieczeństwie. @Doug: skrypt nie zawiesza się - po prostu będzie wymagał ręcznego ssh do zdalnego hosta za pierwszym razem, aby poznał hosta. Ale ochroni cię przed atakami MITM. Zmień tę odpowiedź, aby to odzwierciedlić, ponieważ w obecnym kształcie jest to bardzo niebezpieczna rada. I nawet o to nie prosili.
johndodo
2
Zaktualizowałem moją odpowiedź. Z mojego doświadczenia wynika, że niektórzy klienci mogą się zawiesić.
Doug,
50
Spróbuj tego:
timeout 5 ssh user@ip
timeout wykonuje polecenie ssh (z argumentami) i wysyła SIGTERM, jeśli ssh nie zwróci po 5 sekundach. Aby uzyskać więcej informacji na temat limitu czasu, przeczytaj ten dokument :
http://man7.org/linux/man-pages/man1/timeout.1.html
To może nie robić tego, co chcesz. Rozważ polecenie timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg' To zabija proces po stronie klienta SSH, ale / tmp / blarg nadal jest modyfikowany na serwerze zdalnym. Oznacza to, że jeśli wykonujesz na zdalnym serwerze zadanie mocno obciążające procesor, nastąpi wyciek procesów.
Jamie Davis
1
@JamieDavis a co z ssh user @ server 'timeout 5s sleep 10'?
FilipR
18
Możesz również połączyć się z flagą
-o ServerAliveInterval = <sekundy>
więc klient SSH będzie wysyłał pakiet zerowy do serwera co <secs>sekundę, aby utrzymać połączenie. W Linuksie można to również ustawić globalnie w /etc/ssh/ssh_configlub na użytkownika w ~/.ssh/config.
Cóż, możesz użyć nohup, aby uruchomić wszystko, co uruchomisz w „trybie nieblokującym”. Możesz więc po prostu sprawdzać, czy cokolwiek miało uruchomić, uruchomiło się, w przeciwnym razie zakończyło.
Ma sens. ale skrypt, który jest uruchomiony, daje mi jakieś dane wyjściowe, które są wyświetlane na konsoli .. jak sprawdzić, czy mój poprzedni skrypt został uruchomiony lub zamknięty? $? albo coś innego ?
user57421
Cóż, możesz sprawić, że skrypt utworzy plik po zakończeniu. Dodałem komentarz do odpowiedzi .... grrr
ssh
sesji” (pytanie „Jak zwiększyć limit czasu połączenia SSH?”), To jest niewłaściwe miejsce . Odpowiedź znajduje się pod tym linkiem o ssh-timeout .Odpowiedzi:
Gdzie 10 to czas w sekundach. Ten limit czasu dotyczy tylko tworzenia połączenia.
źródło
Użyj
-o ConnectTimeout
i-o BatchMode=yes -o StrictHostKeyChecking=no
.ConnectTimeout zapobiega zawieszaniu się skryptu, BatchMode zapobiega zawieszaniu się z nieznanym hostem, TAK, aby dodać do known_hosts, a StrictHostKeyChecking automatycznie dodaje odcisk palca.
**** UWAGA **** Funkcja „StrictHostKeyChecking” była przeznaczona tylko dla sieci wewnętrznych, w których ufasz swoim hostom. W zależności od wersji klienta SSH komunikat „Czy na pewno chcesz dodać odcisk palca” może spowodować zawieszenie się klienta na czas nieokreślony (głównie stare wersje działające w systemie AIX). Większość nowoczesnych wersji nie ma tego problemu. Jeśli masz do czynienia z odciskami palców na wielu hostach, polecam utrzymywanie pliku known_hosts za pomocą jakiegoś narzędzia do zarządzania konfiguracją, takiego jak puppet / ansible / chef / salt / etc.
źródło
-o StrictHostKeyChecking=no
nie rozwiązuje tego pytania, ale jest to okropny pomysł, jeśli zależy Ci na bezpieczeństwie, co może być powodem, dla którego używasz SSH w pierwszej kolejności.StrictHostKeyChecking=no
jeśli w ogóle zależy Ci na bezpieczeństwie. @Doug: skrypt nie zawiesza się - po prostu będzie wymagał ręcznego ssh do zdalnego hosta za pierwszym razem, aby poznał hosta. Ale ochroni cię przed atakami MITM. Zmień tę odpowiedź, aby to odzwierciedlić, ponieważ w obecnym kształcie jest to bardzo niebezpieczna rada. I nawet o to nie prosili.Spróbuj tego:
timeout wykonuje polecenie ssh (z argumentami) i wysyła SIGTERM, jeśli ssh nie zwróci po 5 sekundach. Aby uzyskać więcej informacji na temat limitu czasu, przeczytaj ten dokument : http://man7.org/linux/man-pages/man1/timeout.1.html
lub możesz użyć parametru ssh:
źródło
brew install coreutils
a następnie użyjgtimeout
(źródło: stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x ).timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg'
To zabija proces po stronie klienta SSH, ale / tmp / blarg nadal jest modyfikowany na serwerze zdalnym. Oznacza to, że jeśli wykonujesz na zdalnym serwerze zadanie mocno obciążające procesor, nastąpi wyciek procesów.Możesz również połączyć się z flagą
więc klient SSH będzie wysyłał pakiet zerowy do serwera co<secs>
sekundę, aby utrzymać połączenie. W Linuksie można to również ustawić globalnie w/etc/ssh/ssh_config
lub na użytkownika w~/.ssh/config
.źródło
Jeśli wszystko inne zawiedzie (w tym brak
timeout
polecenia), koncepcja tego skryptu powłoki zadziała:źródło
Cóż, możesz użyć nohup, aby uruchomić wszystko, co uruchomisz w „trybie nieblokującym”. Możesz więc po prostu sprawdzać, czy cokolwiek miało uruchomić, uruchomiło się, w przeciwnym razie zakończyło.
Więc w drugim sprawdzasz, czy plik istnieje.
źródło