Как уменьшить время ожидания в Unix Telnet при подключении - PullRequest
19 голосов
/ 15 июля 2009

У меня есть сценарий оболочки Unix, который тестирует FTP-порты нескольких хостов, перечисленных в файле.

for i in `cat ftp-hosts.txt`
        do
        echo "QUIT" | telnet $i 21
done

В целом, этот сценарий работает, однако, если я сталкиваюсь с хостом, который не подключается, то есть telnet "пытается ...", как я могу уменьшить это время ожидания, чтобы он мог проверить следующий хост?

Ответы [ 4 ]

31 голосов
/ 15 июля 2009

Вы пробовали использовать netcat (nc) вместо telnet? У него больше гибкости, в том числе возможность установить время ожидания:

echo "QUIT" | nc -w 5 host 21

Параметр -w 5 отключит соединение через 5 секунд.

3 голосов
/ 17 января 2014

Попробуйте использовать скрипт timeout3 очень надежно, и я много использовал без проблем в разных ситуациях. Пример, чтобы подождать всего 3 секунды, пытаясь проверить, открыт ли порт ssh.

> echo QUIT > quit.txt
> ./timeout3 -t 3 telnet HOST 22 < quit.txt 

выходы: вы можете использовать grep для «Подключен» или «Завершен»

содержимое файла timeout3:

#
#!/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 <Dmitry.Golovashkin@sas.com>

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 "$@"
#
1 голос
/ 15 июля 2009

если у вас есть nmap

 nmap -iL hostfile -p21  | awk '/Interesting/{ip=$NF}/ftp/&&/open/{print "ftp port opened for: "ip}'
1 голос
/ 15 июля 2009

Используйте запуск процесса для сна и уничтожения процесса telnet. Грубо говоря:

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.

Я избежал эха. Выйти | конвейер telnet не оставляет двусмысленности, когда дело доходит до кода выхода первого задания.

Этот код не был проверен.

...