for 또는 루프를 사용하여 홉 서버의 호스트 목록에서 "for 루프"를 실행하는 방법은 무엇입니까?

for 또는 루프를 사용하여 홉 서버의 호스트 목록에서 "for 루프"를 실행하는 방법은 무엇입니까?

홉 서버에서 서버 목록으로 "for 루프"를 실행하려고 합니다. 단일 서버에서 for 루프를 실행하면 제대로 작동하지만 중첩하여 홉 서버에서 작동하게 만드는 방법을 모르겠습니다.

각 호스트의 For 루프 출력:

$ for i in {a..b}; do echo Volume: /dev/sd$i; sudo /usr/sbin/smartctl -a /dev/sd$i | egrep -i "model|serial"; done
Volume: /dev/sda
Device Model:     TOSHIBA THNSNJ256GCSU
Serial Number:    35FS109IT88W
Volume: /dev/sdb
Model Family:     Seagate Constellation ES.3
Device Model:     ST4000NM0033-9ZM170
Serial Number:    Z1Z7EK85
$ 

다음은 일반적으로 홉 서버에서 "for 루프"를 실행하는 방법입니다.

$ for i in `cat hostlist`;do echo $i;ssh $i "uptime";echo " ";done

제안해주세요!

답변1

비슷한 것을 찾고 있을 수도 있습니다.

while IFS= read -r host
do {
  printf "%s\n" "$host"
  ssh -t -- "$host" '
    for i in a b
    do
      printf "%s\n" "Volume: /dev/sd$i"
      sudo smartctl -a "/dev/sd$i" | grep -Ei "model|serial"
    done'
  } 0<&3
done 3<&0 <hostlist

hostlist호스트가 한 줄에 하나씩 파일에 나열되어 있다고 가정합니다 . 호스트 이름에는 공백 문자나 백슬래시가 포함될 가능성이 없으므로 여기서는 불필요할 수 있습니다 IFS=. -r이 경우에도 루프에서 콘텐츠를 hostlist읽는 것이 좋을 수 있지만 루프를 사용하는 것이 좋습니다. 바라보다forwhile공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?이에 대해 자세히 알아보세요.

각 호스트에 대해 가상 터미널을 원격 호스트에 강제로 할당하는 옵션과 함께 호출되며 ssh, 암호를 묻는 메시지가 필요합니다(그렇게 구성하지 않은 경우).-tsudo

3<&0외부 표준 입력의 파일 설명자를 루프 본문에서 사용할 수 있도록 복사하여 새 파일 설명자( )를 엽니다 ( { }이러한 이유로 래핑됩니다). ssh그렇지 않으면 귀하의 정보가 읽혀지고 hostlist당사는 귀하와 상호 작용할 수 없게 됩니다(예: sudo비밀번호가 필요한 경우).

나는 후자이기 때문에 echo으로 대체했습니다.printf더욱 견고해졌습니다(여기서는 꼭 필요한 것은 아니지만). (GNU 매뉴얼 확인) 전자는 더 이상 사용되지 않으며 이전 버전과의 호환성을 위해서만 제공되기 때문에 으로 egrep교체 했습니다 .grep -E

마지막으로 중괄호 확장( )을 {a..b}대체하여 a b해당 기능을 지원하지 않는 기능(예: dash)을 포함하여 모든 POSIX 셸에서 스크립트를 실행할 수 있도록 했습니다.

관련 정보