Você também pode fazer isso iterando os índices da matriz ( ${!hostlist[@]}
, observe o !
) em vez dos valores ( ${hostlist[@]}
) e, em seguida, usando unset
para excluir índices de matriz indesejados.
por exemplo, com base na resposta de @ Kusalananda:
hostlist=( localhost sdfsd sdfs s fsdf localhost sdfs fsdf sdf 127.0.0.1 )
for h in "${!hostlist[@]}"; do
if ! timeout 3 bash -c "</dev/tcp/${hostlist[$h]}/22" 2>/dev/null; then
unset hostlist[$h]
fi
done
printf 'Ok hosts: %s\n' "${hostlist[@]}"
ou, se tiver netcat
instalado, você pode usar nc
em vez do bash /dev/tcp
interno (deve ser um pouco mais rápido do que forking timeout
e bash
para cada host):
hostlist=( localhost sdfsd sdfs s fsdf localhost sdfs fsdf sdf 127.0.0.1 )
for h in "${!hostlist[@]}"; do
if ! nc -w 3 "${hostlist[$h]}" 22 >& /dev/null; then
unset hostlist[$h]
fi
done
printf 'Ok hosts: %s\n' "${hostlist[@]}"
Se você não precisa fazer mais nada dentro da instrução if
/ then
, você a encurta ainda mais:
hostlist=( localhost sdfsd sdfs s fsdf localhost sdfs fsdf sdf 127.0.0.1 )
for h in "${!hostlist[@]}"; do
nc -w 3 "${hostlist[$h]}" 22 >& /dev/null || unset hostlist[$h]
done
printf 'Ok hosts: %s\n' "${hostlist[@]}"