Hoe stel ik de ssh-time-out in?

Ik voer een script uit dat verbinding maakt via wachtwoordloze SSH op een externe host. Ik wil een time-out instellen, zodat als de externe host oneindig veel tijd nodig heeft om uit te voeren, ik uit die ssh-sessie wil komen en andere regels in mijn sh-script wil voortzetten.

Hoe kan ik een time-out instellen?


Antwoord 1, autoriteit 100%

ssh -o ConnectTimeout=10  <hostName>

Waar 10 de tijd in seconden is. Deze time-out is alleen van toepassing op het maken van de verbinding.


Antwoord 2, autoriteit 34%

Gebruik de -o ConnectTimeouten -o BatchMode=yes -o StrictHostKeyChecking=no.

ConnectTimeoutzorgt ervoor dat het script niet blijft hangen, BatchModezorgt ervoor dat het niet blijft hangen bij Host unknown, YES om toe te voegen aan bekende_hosts en StrictHostKeyCheckingvoegt de vingerafdruk automatisch.

**** OPMERKING ****
De “StrictHostKeyChecking” was alleen bedoeld voor interne netwerken waar u uw hosts vertrouwt. Afhankelijk van de versie van de SSH-client, kan de “Weet u zeker dat u uw vingerafdruk wilt toevoegen” ervoor zorgen dat de client voor onbepaalde tijd vastloopt (voornamelijk oude versies die op AIX draaien). De meeste moderne versies hebben hier geen last van. Als je te maken hebt met vingerafdrukken met meerdere hosts, raad ik aan om het bestand known_hosts te onderhouden met een soort configuratiebeheertool zoals puppet/ansible/chef/salt/etc.


Antwoord 3, autoriteit 18%

probeer dit:

timeout 5 ssh user@ip

timeout voert het ssh-commando uit (met args) en stuurt een SIGTERM als ssh na 5 seconden niet terugkeert.
lees dit document voor meer informatie over time-out
http://man7.org/linux/man-pages/man1/timeout.1.html

of je kunt de param van ssh gebruiken:

ssh -o ConnectTimeout=3 user@ip

Antwoord 4, autoriteit 6%

U kunt ook verbinding maken met vlag

-o ServerAliveInterval=<secs>

dus de SSH-client stuurt elke <secs>seconden een null-pakket naar de server, alleen maar om de verbinding in stand te houden.
In Linux kan dit ook globaal worden ingesteld in /etc/ssh/ssh_configof per gebruiker in ~/.ssh/config.


Antwoord 5

Als al het andere faalt (inclusief het niet hebben van de opdracht timeout), zal het concept in dit shellscript werken:

#!/bin/bash
 set -u
 ssh $1 "sleep 10 ; uptime" > /tmp/outputfile 2>&1 & PIDssh=$!
 Count=0
 while test $Count -lt 5 && ps -p $PIDssh > /dev/null
 do
    echo -n .
    sleep 1
    Count=$((Count+1))
 done
 echo ""
 if ps -p $PIDssh > /dev/null
 then
    echo "ssh still running, killing it"
    kill -HUP $PIDssh
 else
    echo "Exited"
 fi

Antwoord 6

Nou, je zou nohup kunnen gebruiken om wat je ook draait in ‘niet-blokkerende modus’ uit te voeren. Dus je kunt gewoon blijven controleren of wat het ook moest draaien, liep of anders afsloot.

nohup ./my-script-that-may-take-long-to-finish.sh &
./check-if-vorige-script-ran-or-exit.sh
echo "Script eindigde op 15 februari 2011, 09:20" > /tmp/klaar.txt

Dus in de tweede check je gewoon of het bestand bestaat.

Other episodes