Поскольку вы запрашиваете сортировку файла в соответствии с порядком, в котором поля появляются в файле, это самый простой способ использования sort
:
sort file1 file2 > outputfile
Notas, demasiado largas para un comentario.
server.txt
podría llamarse mejor server-list
o servers.txt
si lo desea.
Use nombres de variables en minúsculas como, evite SERVER
y similares, podría llamarse mejor server_ip
de todos modos, porque no está claro si usa nombres de host o IP.
Comillas dobles todas las variables numéricas no -enteras -como "$server_ip"
.
Use una declaración directa if
en lugar de variable $OPEN
con 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
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
El problema es que nc
escribe 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 printf
para 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