홉 서버에서 서버 목록으로 "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 매뉴얼을 보면) 전자가 더 이상 사용되지 않고 이전 버전과의 호환성을 위해서만 제공되기 때문에 대체 했습니다 .printf
egrep
grep -E
마지막으로 중괄호 확장 ( {a..b}
)을 로 교체하여 a b
해당 기능을 지원하지 않는 스크립트 (예 :)를 포함하여 모든 POSIX 셸에서 스크립트를 실행할 수 있도록했습니다 dash
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다