나는 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
또는 )의 경우 매우 간결한 출력으로 인해 너무 장황합니다. 예를 들어, 내 홈 네트워크에서:uptime
dshbak
# 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 -g
pdsh -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 -a
uname -a
모든 서버에서 실행됩니다. Server1 및 Server2에서만 실행됩니다 pdsh -g web uptime
. 서버 1, 2, 5, 6에서 실행됩니다. 등등.uptime
pdsh -g web,mysql df -h /
df
그런데 한 가지 이상한 점 은 기본적으로 대신 사용되도록 pdsh
구성되어 있다는 것입니다 .rsh
ssh
-R ssh
pdsh 명령줄에서 사용하세요(예:pdsh -R ssh -w server[0-9] ...
export PDSH_RCMD_TYPE=ssh
달리기 전에pdsh
- 영구 기본값으로
echo ssh > /etc/pdsh/rcmd_default
설정하려면 실행하세요 .ssh
배포용으로 패키지되어 있지 않은 경우 pdsh
LLNL에서 찾을 수 있습니다.https://computing.llnl.gov/linux/pdsh.html
동일한 작업을 수행할 수 있는 다른 도구도 몇 가지 있습니다 pdsh
. 그 중 몇 가지를 사용해 본 결과 일반적으로 설정하고 사용하기가 번거로웠습니다. pdsh
작동하려면 거의 0이거나 최소한의 구성이 필요합니다.