"s"와 "localhot"이 최종 호스트 목록에 남아 있는 이유를 설명할 수 있는 사람이 있습니까?
"s"는 제거되었지만 여전히 남아 있습니다.
$ HOSTLIST="localhost sdfsd sdfs s fsdf localhost sdfs fsdf sdf 127.0.0.1"
$ for h in ${HOSTLIST};do { timeout 3 bash -c "</dev/tcp/${h}/22" 2>/dev/null; } || { echo removing $h from HOSTLIST;HOSTLIST=${HOSTLIST[@]/${h}}; };done ; echo final HOSTLIST :: ${HOSTLIST}
removing sdfsd from HOSTLIST
removing sdfs from HOSTLIST
removing s from HOSTLIST
removing fsdf from HOSTLIST
removing sdfs from HOSTLIST
removing fsdf from HOSTLIST
removing sdf from HOSTLIST
final HOSTLIST :: localhot s localhost 127.0.0.1
$
$ telnet s 22
telnet: s: Name or service not known
s: Host name lookup failure
$ telnet localhot 22
telnet: localhot: Name or service not known
localhot: Host name lookup failure
$
답변1
삭제 시 문자열의 s
첫 번째 항목을 삭제합니다. 이는 아마도 제거하려는 내용이 아닐 것입니다(출력의 알림).s
$HOSTLIST
s
localhot
어레이를 사용하고 좋은 호스트 어레이를 구성하는 것이 더 좋습니다.
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/$h/22" 2>/dev/null; then
ok+=( "$h" )
fi
done
printf 'Ok host: %s\n' "${ok[@]}"
답변2
반복하여 이 작업을 수행할 수도 있습니다.색인배열( ${!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[@]}"