여러 Linux 시스템에서 여러 명령을 실행할 수 없습니까?

여러 Linux 시스템에서 여러 명령을 실행할 수 없습니까?

나는 약 50대의 우분투 머신을 가지고 있고 그 머신에서 다음 명령을 실행해야 합니다:

sudo apt-get install htop
sudo scp -r [email protected]:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r [email protected]:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp [email protected]:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core

그래서 위의 명령을 사용하여 쉘 스크립트 파일을 생성 commands.sh하고 50대의 컴퓨터를 모두 포함하는 또 다른 파일을 생성했습니다 machines.text.

내 컴퓨터 목록은 다음 파일에 있습니다 machines.text.

somemachineA
somemachineB

내 명령은 다음 파일에 있습니다 commands.sh.

#!/bin/bash
sudo apt-get install htop
sudo scp -r [email protected]:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r [email protected]:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp [email protected]:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core

나는 이와 같은 스크립트를 가지고 execute.sh있으며 다음과 같이 실행하고 있습니다 ./execute.sh machines.txt.

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "###################################################"
    echo "Machine Name: $line"
    scp commands.sh $line:/tmp/commands.sh
    ssh -t $line 'script /dev/null . /tmp/commands.sh'
    echo "###################################################"
done < "$1"

위를 실행한 후 아래 오류가 표시되고 다음 명령이 실행되지 않습니다 somemachineA.

todd@testMachine:~$ ./execute.sh machines.text
###################################################
Machine Name: somemachineA
todd@somemachineA's password:
commands.sh                                                                                                                                                                                                100%  104     0.1KB/s   00:00
Pseudo-terminal will not be allocated because stdin is not a terminal.
todd@somemachineA's password:
Script started, file is /dev/null
Script done, file is /dev/null
todd@somemachineA:/home/todd$ somemachineB: command not found

내가 뭘 잘못하고 있으며 여러 Linux 시스템에서 여러 Linux 명령을 어떻게 실행할 수 있습니까?

답변1

교체를 시도하다

ssh -t $line 'script /dev/null . /tmp/commands.sh'

통과

ssh  $line 'bash /tmp/commands.sh'
  • /dev/null에 스크립팅하고 있습니까?
  • 명령을 대화형으로 실행하면 tty가 할당됩니다.

답변2

원하는 작업을 수행하는 데 사용할 수 있는 여러 도구가 있습니다. 내가 가장 좋아하는 것은PDSHpdcp(다중 호스트 scp), pdsh(다중 호스트 ssh) 및 dshbak(호스트별로 그룹화된 다중 호스트 출력 표시)를 포함하는 - dshbakpdsh가 명령을 차례로 실행하는 것이 아니라 여러 호스트에서 병렬로 실행하기 때문에 매우 유용합니다. 나는 클러스터, 가상 머신, 클라우드 서버, 크고 작은 물리적 장치에서 pdsh를 여러 번 사용해 왔습니다. 작업을 잘 수행하고 설정도 쉽습니다.

pdsh는 대부분의 배포판에 미리 패키지되어 제공됩니다.

이를 사용하려면 쉼표로 구분된 호스트 이름 목록과 해당 호스트가 속한 "그룹" 이름이 포함된 호스트 파일(기본적으로 /etc/genders)을 만들어야 합니다. 각 호스트는 하나 이상의 그룹에 속할 수 있습니다. 예를 들어 일부 호스트는 "webserver" 그룹에 속할 수 있고, 일부 호스트는 "dbserver" 그룹에 속할 수 있으며, 모든 호스트는 "all" 그룹에 속할 수 있습니다. 예를 들어:

somemachineA all
somemachineB all

그런 다음 pdcp를 사용하여 "all" 그룹의 모든 호스트에 스크립트를 복사할 수 있습니다.

pdcp -g all commands.sh /tmp/

(참고: 원격 호스트의 /tmp는 exec privs를 사용하여 마운트해야 합니다. 이는 대부분의 파일 시스템의 기본값이지만 보안을 위해 noexec를 사용하여 /tmp를 마운트하는 것은 드문 일이 아닙니다. 이 경우 pdcp를 다른 위치로 스크립트하거나 예를 들어, bash /tmp/commands.sh그냥 /tmp/commands.sh?

그런 다음 모든 호스트에서 스크립트를 실행합니다.

pdsh -g all /tmp/commands.sh >& /tmp/commands.log

(참고: 이는 비밀번호 없는 로그인을 위해 모든 호스트에 ssh가 구성되어 있다고 가정합니다. 즉, 비밀번호 대신 ssh 키를 사용합니다. 그렇지 않은 경우 대화형 사용이 가능하므로 출력을 로그 파일로 리디렉션하지 않는 것이 가장 좋습니다. SSH 키 액세스를 위해 원격 호스트를 구성한 다음 비밀번호 로그인을 비활성화해야 합니다.)

완료되면 dshbak를 사용하여 로그를 볼 수 있습니다.

dshbak /tmp/commands.log | less

마지막으로, pdsh 등에 대해 알아두면 유용한 점은 기본적으로 ssh 대신 rsh를 사용하려고 시도한다는 것입니다. 더 이상 rsh를 사용하는 사람이 없기 때문에 왜 그런지 모르겠습니다... 하지만 수정하기 쉽습니다. 라는 파일을 /etc/pdsh/rcmd_default만들고 ssh.

관련 정보