for 또는 any 루프를 사용하여 홉 서버의 호스트 목록에서 "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

제안 해주세요!

프라 산

아마도 다음과 같은 것을 찾고있을 것입니다.

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에서 읽는 for것은 괜찮지 만 while루프를 사용하는 것은 좋은 습관입니다. 셸 스크립트가 공백이나 기타 특수 문자로 인해 질식하는 이유는 무엇입니까?를 참조하십시오 . 이에 대한 자세한 내용은.

각 호스트 에 대해 원격 호스트에서 의사 터미널을 강제로 할당 ssh하는 -t옵션 과 함께 호출되며, sudo요청 하는 암호를 입력하는 데 필요 합니다 (구성하지 않은 경우).

새로운 파일 디스크립터가 열리고 ( 3<&0), 외부 표준 입력을 복제하여 루프 본문에서 후자를 사용할 수 있도록합니다 ( { }이러한 이유로 래핑 됨 ). ssh그렇지 않으면 사용자로부터 읽고 hostlist상호 작용할 수 없습니다 (예 : sudo암호 필요한 경우 ).

후자가 더 강력 하기 때문에 로 교체 echo했습니다 (여기서도 꼭 필요하지는 않더라도). 그리고 나는 (GNU 매뉴얼을 보면) 전자가 더 이상 사용되지 않고 이전 버전과의 호환성을 위해서만 제공되기 때문에 대체 했습니다 .printfegrepgrep -E

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

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관