읽기 루프 동안 SSH를 사용하여 stdin에서 읽기

읽기 루프 동안 SSH를 사용하여 stdin에서 읽기

호스트 이름과 IP 주소 목록을 반환하는 쉘 함수가 있습니다.

$ list_hosts
hostA 10.1.1.1
hostB 10.1.1.2
hostC 10.1.1.3

각 호스트마다 다른 주소를 얻고 싶습니다.

$ function list_ip6 {
  list_hosts | while read -r hostname ip ; do
    ip6=$(ssh ${ip} ip -o address list eth0 | awk '/scope global/ {print $4;}')
    echo "Host ${name} has IP6 ${ip}"
  done
}

이는 반환된 첫 번째 호스트의 IP6만 인쇄합니다 list_hosts.

$ list_ip6
Host hostA has IP6 fd57:9e3a:c90e:753f:d625:ccff:feb0:7984/128

문제는 두 번째 줄의 명령 대체인 것 같습니다. 주석 처리하면 모든 호스트를 통해 반복됩니다.

$ list_ip6
Host hostA has IP6
Host hostB has IP6
Host hostC has IP6

프로세스 교체가 슬레이브의 출력을 읽는 데 방해가 됩니까 list_hosts?

busybox 쉘에서 이를 수행할 수 있는 좋은 방법이 있습니까 ash? 내 경우에는 bash행을 배열로 읽고 배열을 반복했지만 물론 Ash에서는 옵션이 아닙니다.

다음을 추가하도록 편집되었습니다.

문제는 특히 ssh연결에 있는 것 같습니다. 각 호스트의 로컬 IP6을 인쇄하면 제대로 작동합니다.

$ function list_ip6 {
  list_hosts | while read -r hostname ip ; do
    ip6=$(ip -o address list eth0 | awk '/scope global/ {print $4;}')
    echo "Host ${name} has IP6 ${ip}"
  done
}

$ list_ip6
Host hostA has IP6 fd57:9e3a:c90e:753f:d625:ccff:feb0:7931/128
Host hostB has IP6 fd57:9e3a:c90e:753f:d625:ccff:feb0:7931/128
Host hostC has IP6 fd57:9e3a:c90e:753f:d625:ccff:feb0:7931/128

프로세스 교체는 문제가 되지 않습니다. 단지 SSH가 어떻게든 루프에서 벗어나는 것뿐입니다.

관련 정보