여러 호스트에서 SSH를 통해 서비스 확인을 수행해야 합니다.
호스트 목록을 말하세요:host1host2host3
아래와 같이 스크립트를 작성했는데 SSH에서만 멈췄습니다.
#!/bin/bash
service=splunk
for host in $(</tmp/tstuf.txt);
do
ssh $host;
if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
echo "$service is running"
else
echo "$service is not running"
fi
done
스크립트를 실행할 때 ssh를 실행하고 현재 호스트에서 호스트 1로 이동하다가 거기에서 멈추게 됩니다. 서비스 점검을 실행하지 않았습니다. 누구든지 제안할 수 있나요
답변1
실행할 명령을 내리지 않았기 때문에 스크립트가 "ssh에 멈췄습니다". 대화형 SSH 세션이 방금 ssh $host
설정 되었으며 $host
사용자가 상호작용을 시작하기를 기다리고 있습니다.
exit
원격 호스트에서 오면 스크립트가 계속해서 로컬 if (( $(ps ....) > 0 )); then .......... fi
시스템에서 실행됩니다. 그런 다음 목록의 다음 호스트에 대해 for 루프를 계속합니다(종료될 때까지 다시 "멈춤").
#!/bin/bash
service=splunk
for host in $(</tmp/tstuf.txt); do
ssh $host "if (( \$(ps -ef | grep -v grep | grep $service | wc -l) > 0 )); then
echo $service is running
else
echo $service is not running
fi"
done
또는 @DopeGhoti가 제안한 것처럼 더 간단하고 더 나은 대안은 다음과 같습니다.
#!/bin/sh
service=splunk
for host in $(</tmp/tstuf.txt); do
# echo -n "$host:" # optional. uncomment the echo if wanted.
ssh "$host" service "$service" status
done
더 나은 옵션은 LLNL의 병렬 분산 셸과 같은 것을 설치하는 것입니다.PDSH, 그런 다음 (호스트 목록 파일을 구성한 후 /etc/genders
) 다음 명령을 실행할 수 있습니다.
pdsh -g all service splunk status
service splunk status
"all" 태그로 정의된 호스트 그룹에서 실행됩니다.
pdsh
한 번에 하나씩 실행하는 것이 아니라 여러 호스트에서 동시에 명령을 실행합니다(따라서 "병렬 분산 쉘"이라는 이름이 붙음). 원격 시스템의 각 출력 행에는 해당 호스트 이름이 접두어로 붙습니다.
예를 들어 내 소규모 홈 네트워크에서는 다음과 같습니다.
$ pdsh -g all uptime
kali: 12:09:03 up 3 days, 23:26, 2 users, load average: 0.08, 0.05, 0.06
hanuman: 12:09:03 up 12 days, 13:09, 2 users, load average: 0.00, 0.00, 0.00
indra: 12:09:03 up 12 days, 13:05, 2 users, load average: 0.07, 0.12, 0.09
ganesh: 12:09:03 up 34 days, 23:34, 19 users, load average: 1.86, 1.48, 1.40
그런데 위의 예와 같은 한 줄 출력은 uptime
예를 들어 column -t
여러 줄 출력을 pdsh
호스트 이름별로 그룹화하기 위한 동반 유틸리티 로 파이프할 수 있습니다 dshbak
.
항상 비밀번호를 입력하고 싶지 않다면 for 루프나 SSH를 통해 연결하는 다른 모든 것과 마찬가지로 각 원격 호스트에 SSH 키 기반 인증을 설정해야 합니다.
pdsh
데비안 및 대부분의 기타 Linux 배포판용으로 패키지되었습니다.
답변2
한 줄 내에서 반복합니다. 'pgrep'의 반환 상태는 ssh에 의해 로컬 호스트로 반환됩니다.
echo "$host: $service is $(ssh $host pgrep $service >/dev/null || echo "NOT ")running"