Вы также можете сделать это, перебирая индексы массива (${!hostlist[@]}
, обратите внимание на !
), а не значения (${hostlist[@]}
), а затем используя unset
для удаления нежелательные индексы массива.
например, на основе ответа @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[@]}"
или, если у вас установлен netcat
, вы можете использовать nc
вместо bash /dev/tcp
, встроенный -в (должен быть немного быстрее, чем разветвление timeout
и bash
для каждого хозяин):
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[@]}"
Если вам больше не нужно делать что-либо внутри оператора if
/ then
, вы можете сократить его еще больше:
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[@]}"
Я не уверен, что это проблема, но у меня были проблемы из-за устаревшего монтирования NFS. Если бы вы могли подключиться по ssh к одному из неисправных серверов и посмотреть, будет ли команда df работать без зависаний, чтобы исключить это.