실패한 SSH 호스트를 어레이에서 제거합니다.

실패한 SSH 호스트를 어레이에서 제거합니다.

"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$HOSTLISTslocalhot

어레이를 사용하고 좋은 호스트 어레이를 구성하는 것이 더 좋습니다.

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내장된 ncbash를 대신 사용할 수 있습니다(각 호스트에 대해 포크보다 약간 더 빠름)./dev/tcptimeoutbash

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[@]}"

관련 정보