J'ai un script de shell UNIX qui testent les ports FTP de plusieurs hôtes répertoriés dans un fichier.
for i in `cat ftp-hosts.txt`
do
echo "QUIT" | telnet $i 21
done
En général, ces scripts fonctionnent, cependant, si je rencontre un hôte qui ne se connecte pas, c'est-à-dire "Telnet" essayer ... ", comment puis-je réduire ce temps d'attente afin qu'il puisse tester le prochain hôte?
Avez-vous essayé d'utiliser necat (nc
) au lieu de telnet? Il a plus de flexibilité, y compris être capable de définir le délai d'attente:
echo 'QUIT' | nc -w SECONDS YOUR_Host PORT
# e.g.
echo "QUIT" | nc -w 5 localhost 21
Les -w 5
L'option dépendra la connexion après 5 secondes.
Essayez d'utiliser le script Timeout3 est très robuste et j'ai beaucoup utilisé sans problèmes sur différentes situations. Exemple d'attente seulement 3 secondes en essayant de vérifier si le port SSH est ouvert.
> echo QUIT > quit.txt
> ./timeout3 -t 3 telnet Host 22 < quit.txt
sorties: vous pouvez grep pour "connecté" ou "terminé"
timeout3 Contenu du fichier:
#!/bin/bash
#
# The Bash Shell script executes a command with a time-out.
# Upon time-out expiration SIGTERM (15) is sent to the process. If the signal
# is blocked, then the subsequent SIGKILL (9) terminates it.
#
# Based on the Bash documentation example.
# If you find it suitable, feel free to include
# anywhere: the very same logic as in the original examples/scripts, a
# little more transparent implementation to my taste.
#
# Dmitry V Golovashkin <[email protected]>
scriptName="${0##*/}"
declare -i DEFAULT_TIMEOUT=9
declare -i DEFAULT_INTERVAL=1
declare -i DEFAULT_DELAY=1
# Timeout.
declare -i timeout=DEFAULT_TIMEOUT
# Interval between checks if the process is still alive.
declare -i interval=DEFAULT_INTERVAL
# Delay between posting the SIGTERM signal and destroying the process by SIGKILL.
declare -i delay=DEFAULT_DELAY
function printUsage() {
cat <<EOF
Synopsis
$scriptName [-t timeout] [-i interval] [-d delay] command
Execute a command with a time-out.
Upon time-out expiration SIGTERM (15) is sent to the process. If SIGTERM
signal is blocked, then the subsequent SIGKILL (9) terminates it.
-t timeout
Number of seconds to wait for command completion.
Default value: $DEFAULT_TIMEOUT seconds.
-i interval
Interval between checks if the process is still alive.
Positive integer, default value: $DEFAULT_INTERVAL seconds.
-d delay
Delay between posting the SIGTERM signal and destroying the
process by SIGKILL. Default value: $DEFAULT_DELAY seconds.
As of today, Bash does not support floating point arithmetic (sleep does),
therefore all delay/time values must be integers.
EOF
}
# Options.
while getopts ":t:i:d:" option; do
case "$option" in
t) timeout=$OPTARG ;;
i) interval=$OPTARG ;;
d) delay=$OPTARG ;;
*) printUsage; exit 1 ;;
esac
done
shift $((OPTIND - 1))
# $# should be at least 1 (the command to execute), however it may be strictly
# greater than 1 if the command itself has options.
if (($# == 0 || interval <= 0)); then
printUsage
exit 1
fi
# kill -0 pid Exit code indicates if a signal may be sent to $pid process.
(
((t = timeout))
while ((t > 0)); do
sleep $interval
kill -0 $$ || exit 0
((t -= interval))
done
# Be Nice, post SIGTERM first.
# The 'exit 0' below will be executed if any preceeding command fails.
kill -s SIGTERM $$ && kill -0 $$ || exit 0
sleep $delay
kill -s SIGKILL $$
) 2> /dev/null &
exec "$@"
Utilisez Démarrer un processus pour vous coucher et tuer le processus Telnet. Grossièrement:
echo QUIT >quit.txt
telnet $i 21 < quit.txt &
sleep 10 && kill -9 %1 &
ex=wait %1
kill %2
# Now check $ex for exit status of telnet. Note: 127 inidicates success as the
# telnet process completed before we got to the wait.
J'ai évité l'Echo Quitting | Telnet Pipeline Ne laissez aucune ambiguïté en ce qui concerne le code de sortie du premier emploi.
Ce code n'a pas été testé.
si vous avez NMAP
nmap -iL hostfile -p21 | awk '/Interesting/{ip=$NF}/ftp/&&/open/{print "ftp port opened for: "ip}'
Utilisez Timeout Pour quitter X secondes, que l'opération réussisse ou échoue:
le délai d'attente exécute une commande avec une limite de temps, une commande de démarrage et la tuez-la si elles fonctionnent toujours après la durée.
Formule :
timeout <seconds> <operation>
Exemple :
timeout 5 ping google.com
Votre exemple :
for i in `cat ftp-hosts.txt`
do
timeout 5 telnet $i 21
done