SSH를 통해 호스트에 접속하고 서비스 확인 스크립트를 실행합니다.

SSH를 통해 호스트에 접속하고 서비스 확인 스크립트를 실행합니다.

여러 호스트에서 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"

관련 정보