홉 서버에서 서버 목록으로 "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
읽는 것이 좋을 수 있지만 루프를 사용하는 것이 좋습니다. 바라보다for
while
공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?이에 대해 자세히 알아보세요.
각 호스트에 대해 가상 터미널을 원격 호스트에 강제로 할당하는 옵션과 함께 호출되며 ssh
, 암호를 묻는 메시지가 필요합니다(그렇게 구성하지 않은 경우).-t
sudo
3<&0
외부 표준 입력의 파일 설명자를 루프 본문에서 사용할 수 있도록 복사하여 새 파일 설명자( )를 엽니다 ( {
}
이러한 이유로 래핑됩니다). ssh
그렇지 않으면 귀하의 정보가 읽혀지고 hostlist
당사는 귀하와 상호 작용할 수 없게 됩니다(예: sudo
비밀번호가 필요한 경우).
나는 후자이기 때문에 echo
으로 대체했습니다.printf
더욱 견고해졌습니다(여기서는 꼭 필요한 것은 아니지만). (GNU 매뉴얼 확인) 전자는 더 이상 사용되지 않으며 이전 버전과의 호환성을 위해서만 제공되기 때문에 으로 egrep
교체 했습니다 .grep -E
마지막으로 중괄호 확장( )을 {a..b}
대체하여 a b
해당 기능을 지원하지 않는 기능(예: dash
)을 포함하여 모든 POSIX 셸에서 스크립트를 실행할 수 있도록 했습니다.