2011-02-08 21 views
113

Wykonuję skrypt łączący się bez użycia hasła SSH na hoście zdalnym. Chcę ustawić limit czasu, więc jeśli zdalny host wykonuje nieskończony czas do uruchomienia, chcę wyjść z tej sesji ssh i kontynuować inne linie w moim skrypcie sh.Jak zrobić ssh z limitem czasu w skrypcie?

Każdy pomysł, jak to zrobić?

+0

ten powinien być pewnie zamknięta być zgodne z zamknięciem kompletny duplikat to [jak zmniejszyć wartość limitu czasu połączenia ssh \ [zamknięto \]] (https://stackoverflow.com/questions/18389367/how-to-decrease-ssh-connection-timeout-value) – Murmel

+0

Jeśli przekierowałeś tutaj tylko na * " zostań więcej czasu w sesji 'ssh' * (pytanie" Jak zwiększyć limit czasu połączenia SSH? "), jest to ** złe miejsce **. Odpowiedź jest pod adresem [ten link o ssh-timeout] (https://bjornjohansen.no/ssh-timeout). –

Odpowiedz

190
ssh -o ConnectTimeout=10 <hostName> 

Gdzie 10 to czas w sekundach.

+4

ConnectTimeout ustala tylko limit czasu na konfigurację połączenia, prawda? –

+0

Tak .___________ – johndodo

+4

To faktycznie nie działa dla "zdalnego hosta trwa nieskończony czas, aby uruchomić": "ssh -o ConnectTimeout = 5 host 'snu 10" "czeka na 10 sekund, nie 5. –

-8

jak o użyciu tej komendy w pętli

set timeout -1 
+0

Czy możesz podać mi więcej informacji na temat ustawiania limitu czasu, jeśli używam w pętli .. skrypt wykonuje na zdalnym hoście – user57421

0

Cóż, można użyć nohup uruchomić cokolwiek używasz na „tryb non-blocking”. Więc możesz po prostu sprawdzać, czy to, co powinno działać, było uruchomione, w przeciwnym razie wyjdź.

 
nohup ./my-script-that-may-take-long-to-finish.sh & 
./check-if-previous-script-ran-or-exit.sh 
 

echo "Script ended on Feb 15, 2011, 9:20AM" > /tmp/done.txt 

Więc w drugim po prostu sprawdzić, czy plik istnieje.

+0

To ma sens. ale skrypt, który jest uruchomiony daje mi pewne wyjście, które jest wyświetlane na konsoli .. jak sprawdzić, czy mój poprzedni skrypt uruchomił się lub opuścił? $? albo coś innego ? – user57421

+0

Cóż, możesz sprawić, że ten skrypt utworzy plik po zakończeniu. Dodałem komentarz do odpowiedzi .... grrr – Eduardo

84

Użyj -o ConnectTimeout i -o BatchMode=yes -o StrictHostKeyChecking=no.

ConnectTimeout przechowuje skrypt z wiszące, BatchMode utrzymuje ją z wiszące z nieznanego Host, YES, aby dodać do known_hosts i StrictHostKeyChecking dodaje odcisk automatycznie.

**** UWAGA **** "StrictHostKeyChecking" był przeznaczony tylko dla sieci wewnętrznych, w których ufasz hostom. W zależności od wersji klienta SSH "Czy na pewno chcesz dodać swój odcisk palca" może spowodować, że klient zawiesi się w nieskończoność (głównie stare wersje działające w systemie AIX). Większość współczesnych wersji nie cierpi z powodu tego problemu. Jeśli masz do czynienia z odciskami palców z wieloma hostami, polecam utrzymywanie pliku known_hosts przy pomocy jakiegoś narzędzia do zarządzania konfiguracją, takiego jak kukiełka/ansibli/chef/salt/etc.

+8

Nie tylko '-o StrictHostKeyChecking = no' nie odpowiada na pytanie, ale to straszny pomysł, jeśli zależy ci na bezpieczeństwie, z którego może być powodem korzystania z SSH. – Dolph

+4

Warto zwrócić uwagę na możliwe implikacje związane z bezpieczeństwem opcji -o StrictHostKeyChecking = no. Zapobiegnie to zawieszeniu się skryptu podczas wykonywania. – Doug

+1

OSTRZEŻENIE !!!! Jak napisał @Dolph, NIE używaj 'StrictHostKeyChecking = no' jeśli w ogóle zależy ci na bezpieczeństwie. @Doug: skrypt nie zawiesi się - po prostu będzie nalegał, że ssh do zdalnego hosta ręcznie po raz pierwszy, więc poznaje hosta. Ale chroni cię przed atakami MITM. Edytuj tę odpowiedź, aby to odzwierciedlić, ponieważ jest to bardzo niebezpieczna rada w obecnej formie. I nawet o to nie pytano. – johndodo

13

Można również połączyć się z flagą

-o ServerAliveInterval=<secs>
, aby klient SSH wysłał zerowy pakiet na serwer, każdy <secs> sekund, aby utrzymać połączenie przy życiu. W Linuksie można to ustawić globalnie w /etc/ssh/ssh_config lub na użytkownika w ~/.ssh/config.

+1

To brzmi jak przeciwieństwo pytania. –

29

spróbuj tego:

timeout 5 ssh [email protected] 

Timeout wykonuje polecenie ssh (z args) i wysyła SIGTERM jeśli ssh nie powraca po 5 sek. więcej szczegółów na temat czasu oczekiwania, przeczytaj ten dokument: http://man7.org/linux/man-pages/man1/timeout.1.html

lub można użyć param ssh:

ssh -o ConnectTimeout=3 [email protected] 
+2

Jeśli szukasz tego polecenia na Macu, spróbuj 'brew install coreutils', a następnie użyj' gtimeout' (źródło: http://stackoverflow.com/questions/3504945/timeout-command-on-mac-os- x). – larcher

+0

To może nie zrobić, co chcesz. Rozważmy polecenie "timeout 3s ssh user @ server" sleep 5; echo blarg >>/tmp/blarg'' To zabija proces po stronie klienta SSH, ale/tmp/blarg wciąż jest modyfikowany na serwerze zdalnym. Oznacza to, że jeśli na serwerze zdalnym działa niewykorzystywane przez procesor intensywne obciążenie procesora, nastąpi wyciek procesów. –

Powiązane problemy