test - ¿Cómo puedo reducir el tiempo de espera en unix telnet en la conexión
telnet linux port (4)
Tengo un script de shell de Unix que prueba los puertos ftp de varios hosts enumerados en un archivo.
for i in `cat ftp-hosts.txt`
do
echo "QUIT" | telnet $i 21
done
En general, estos scripts funcionan, sin embargo, si encuentro un host que no se conecta, es decir, telnet está "Intentando ...", ¿cómo puedo reducir este tiempo de espera para que pueda probar el siguiente host?
¿Has intentado usar netcat ( nc
) en lugar de telnet? Tiene más flexibilidad, lo que incluye poder establecer el tiempo de espera:
echo "QUIT" | nc -w 5 host 21
La opción -w 5
expirará la conexión después de 5 segundos.
Trate de usar el script timeout3 es muy robusto y utilicé mucho sin problemas en diferentes situaciones. Ejemplo para esperar solo 3 segundos tratando de verificar si el puerto ssh está abierto.
> echo QUIT > quit.txt
> ./timeout3 -t 3 telnet HOST 22 < quit.txt
salidas: puede grep para "Conectado" o "Terminado"
contenidos del archivo 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 <[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 "$@"
#
Utilice iniciar un proceso para dormir y matar el proceso de telnet. Aproximadamente:
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.
Evité el eco SALIR | El canal de telnet no deja ninguna ambigüedad cuando se trata del código de salida del primer trabajo.
Este código no ha sido probado.
si tienes nmap
nmap -iL hostfile -p21 | awk ''/Interesting/{ip=$NF}/ftp/&&/open/{print "ftp port opened for: "ip}''