쉘 스크립트: 동일한 도메인의 서버에 로그인하여 명령을 실행하고 종료하고 싶습니다.

쉘 스크립트: 동일한 도메인의 서버에 로그인하여 명령을 실행하고 종료하고 싶습니다.

나는 10개의 Unix 서버를 가지고 있고 하나씩 로그인하여 4-5줄의 코드를 실행하고 출력을 저장하고 종료하려고 합니다.

예: 10개 사본:

처음에는 xyz 서버에서

서버 1에 로그인 --> 4-5행 실행 --> xyz 서버로 출력 보내기 --> 종료

서버 2에 로그인 --> 4-5행 실행 --> xyz 서버로 출력 보내기 --> 종료

....

서버 10에 로그인 --> 4-5행 실행 --> xyz 서버로 출력 보내기 --> 종료

마지막으로 파일이 XYZ 서버에 출력됩니다.


예를 들어, 시간을 1시간으로 되감기, 새 시간을 출력으로 사용, 새 시간을 다음 형식으로 xyz 서버의 파일에 저장하는 등 몇 가지 시간 명령을 실행하고 싶습니다.

Server Name    New Time
===========    ========= 
Server1       Date and Time
Server2       Date and Time

답변1

원래 질문에는 설명이 많지 않았으므로 다음과 같은 것으로 추측합니다.

다음과 같이 SSH를 통해 원격 호출을 수행하여 원격 서버에서 명령을 실행할 수 있습니다.

result=`ssh -t server1.mydomain.com "commands;separated;by;semicolons --with-args" > log-on-xyz.log 2>&1` echo "$result"

목록의 각 서버를 반복하여 이를 수행합니다. 마지막으로 로그 출력을 화면에 표시하고 삭제할 수 있습니다.

명령을 세미콜론으로 구분하여 "연결"하여 매개변수를 사용할 수 있습니다. 또한 원격 호출에서 로컬 변수를 매개변수로 사용할 수 있습니다.

편집: 이것은 BASH 스크립트이지만 약간 수정하면 다른 언어에서도 작동합니다.

답변2

일부 정보가 누락되어 질문이 불분명합니다. 지금까지의 내용을 시도해 보겠습니다. 10개의 서버 IP 주소가 192.168.1.11..192.168.1.20이라고 가정합니다.

#!/bin/bash

for host in 192.168.1.{11..20}
do
    echo "#############################################################################"
    echo "$host:"
    # check if host is alive, if positive, then execute command in remote server
    ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=quiet user@$host exit
    if [ $? -ne 0 ];then 
        echo -e "\033[0;101m\033[1;37mOFFLINE\033[0m"
    else
        ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=quiet user@$host "execute_command"
    fi
done

이제 쉘 스크립트를 저장하고 stdout 및 stderr을 로그 파일로 리디렉션하십시오.

./script.sh &> log.txt

답변3

Install을 수행 pdsh한 후 다음 명령을 실행할 수 있습니다.

pdsh -w server[0-9],server10 'command1 ; command2 ;... ; command5' > logfile.txt

참고: 각 서버의 비밀번호를 입력하지 않으려면 원격 서버에 Authorized_key를 설치해야 합니다. 필요한 경우 환경 변수를 사용하여 PDSH_SSH_ARGS사용할 ID 파일( -i)을 포함한 SSH 옵션을 지정할 수 있습니다.

명령이 실행됩니다평행하게모든 서버에서 해당 출력은 함께 혼합됩니다(호스트 이름은 각 출력 줄 앞에 추가됩니다). 호스트로 구분된 올바른 형식의 출력을 보는 데 사용할 수 있는 pdsh유틸리티 dshbak:

dshbak logfile.txt | less

또는 로그 파일로 리디렉션하기 전에 dshbak를 통해 파이프할 수 있습니다.

pdsh -w server[0-9],server10 'command1 ; command2 ;... ; command5' | 
    dshbak > logfile.txt

IMO 원본 로그 파일을 저장하고 필요할 때 사용하는 것이 더 좋지만 dshbak그것은 단지 주관적인 취향일 뿐입니다. 한 줄의 출력만 생성 하는 원격 명령 (예: uname또는 )의 경우 매우 간결한 출력으로 인해 너무 장황합니다. 예를 들어, 내 홈 네트워크에서:uptimedshbak

# pdsh -g all uptime
kali:  12:03:18 up 33 days, 23 min,  3 users,  load average: 0.21, 0.06, 0.06
hanuman:  12:03:37 up 10 days, 21:59,  2 users,  load average: 0.04, 0.05, 0.05
indra:  12:02:57 up 13 days,  1:12,  3 users,  load average: 0.30, 0.26, 0.30
ganesh:  12:03:10 up 6 days, 10:11,  6 users,  load average: 1.18, 1.34, 1.35

이름이 지정된 파일에 호스트와 호스트 그룹을 정의한 다음 /etc/genders대신 사용하여 호스트 그룹을 지정할 수 있습니다. 예를 들어 다음과 같은 파일을 사용합니다.pdsh -gpdsh -w/etc/genders

server1  all,web
server2  all,web
server3  all,mail
server4  all,mail
server5  all,mysql
server6  all,mysql

pdsh -g all uname -auname -a모든 서버에서 실행됩니다. Server1 및 Server2에서만 실행됩니다 pdsh -g web uptime. 서버 1, 2, 5, 6에서 실행됩니다. 등등.uptimepdsh -g web,mysql df -h /df

그런데 한 가지 이상한 점 은 기본적으로 대신 사용되도록 pdsh구성되어 있다는 것입니다 .rshssh

  1. -R sshpdsh 명령줄에서 사용하세요(예:pdsh -R ssh -w server[0-9] ...
  2. export PDSH_RCMD_TYPE=ssh달리기 전에pdsh
  3. 영구 기본값으로 echo ssh > /etc/pdsh/rcmd_default설정하려면 실행하세요 .ssh

배포용으로 패키지되어 있지 않은 경우 pdshLLNL에서 찾을 수 있습니다.https://computing.llnl.gov/linux/pdsh.html


동일한 작업을 수행할 수 있는 다른 도구도 몇 가지 있습니다 pdsh. 그 중 몇 가지를 사용해 본 결과 일반적으로 설정하고 사용하기가 번거로웠습니다. pdsh작동하려면 거의 0이거나 최소한의 구성이 필요합니다.

관련 정보