web-dev-qa-db-fra.com

Comment réduire le délai d'attente sur Unix telnet sur la connexion

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?

21
chrisc

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.

33
DaveR

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 "$@"
3
rbologna

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é.

1
George Phillips

si vous avez NMAP

 nmap -iL hostfile -p21  | awk '/Interesting/{ip=$NF}/ftp/&&/open/{print "ftp port opened for: "ip}'
1
ghostdog74

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
0
avivamg