Ошибка IF в цикле WHILE в сценарии BASH, который проверяет наличие открытых 22 портов

Поскольку вы запрашиваете сортировку файла в соответствии с порядком, в котором поля появляются в файле, это самый простой способ использования sort :

sort file1 file2 > outputfile
1
11.05.2018, 02:21
3 ответа

Notas, demasiado largas para un comentario.

  1. server.txtpodría llamarse mejor server-listo servers.txtsi lo desea.

  2. Use nombres de variables en minúsculas como, evite SERVERy similares, podría llamarse mejor server_ipde todos modos, porque no está claro si usa nombres de host o IP.

  3. Comillas dobles todas las variables numéricas no -enteras -como "$server_ip".

  4. Use una declaración directa ifen lugar de variable $OPENcon una redirección al agujero negro(/dev/null).


Reescrito en base a lo anterior:

#!/bin/sh

while read server_ip
do

    if nc -z -v -w5 "$server_ip" 22 > /dev/null 2>&1
    then
        echo "Found SSH port open on $server_ip."
    else
        echo "Did not find open SSH port on $server_ip."
    fi

done < server-list
3
27.01.2020, 23:12

La ​​solución más simple parece ser:

if nc -z -v -w5 $SERVER 22 >/dev/null 2>&1;
then
    echo "Found SSH open on $SERVER"
else
    echo "No open ports on $SERVER!"    
fi
3
27.01.2020, 23:12

El problema es que ncescribe en un error estándar al generar mensajes de diagnóstico, mientras que una sustitución de comando solo captura la salida estándar.

También debería usar ==en [[... ]]. Las expansiones variables deben citarse e idealmente estaría usando printfpara generar datos variables.

Esto significa que su código podría verse como

while read SERVER do
    OPEN=$( nc -z -v -w5 "$SERVER" 22 2>&1 )
    if [[ "$OPEN" == *succ* ]]; then
        printf 'Found SSH open on %s'\n' "$SERVER"
    else
        printf 'No open ports on %s!\n' "$SERVER"    
    fi
done <server.txt

o

while read SERVER do
    OPEN=$( nc -z -v -w5 "$SERVER" 22 2>&1 )
    case "$OPEN" in
        *succ*) printf 'Found SSH open on %s'\n' "$SERVER" ;;
        *)      printf 'No open ports on %s!\n' "$SERVER"  ;;
    esac
done <server.txt

O simplemente podría usar el estado de salida denc:

while read SERVER do
    if nc -z -v -w5 "$SERVER" 22 >/dev/null 2>&1; then
        printf 'Found SSH open on %s'\n' "$SERVER"
    else
        printf 'No open ports on %s!\n' "$SERVER"
    fi
done <server.txt
1
27.01.2020, 23:12

Теги

Похожие вопросы