많은 서버에서 SSH를 통해 명령 실행 자동화

많은 서버에서 SSH를 통해 명령 실행 자동화

.txt 파일에는 IP 주소 목록이 있습니다. 예:

1.1.1.1
2.2.2.2
3.3.3.3

각 IP 주소 뒤에는 서버가 있고 각 서버의 포트 22에서 실행되는 SSHD가 있습니다. 모든 서버가 목록에 있는 것은 아닙니다 known_hosts(내 PC에서는 Ubuntu 10.04 LTS/bash).

이러한 서버에서 명령을 실행하고 출력을 수집하려면 어떻게 해야 합니까?

이상적으로는 모든 서버에서 명령을 병렬로 실행하고 싶습니다.

모든 서버에서 공개 키 인증을 사용하겠습니다.

다음은 몇 가지 잠재적인 함정입니다.

  • ssh는 주어진 서버 SSH 키를 내 known_hosts파일에 넣으라는 메시지를 표시합니다.
  • 주어진 명령은 출력이 유효하지 않을 수 있음을 나타내는 0이 아닌 종료 코드를 반환할 수 있습니다. 나는 이것을 깨달아야 한다.
  • 예를 들어 네트워크 오류로 인해 특정 서버에 대한 연결이 설정되지 않을 수 있습니다.
  • 명령을 실행하는 데 예상보다 시간이 오래 걸리거나 명령을 실행하는 동안 서버에 오류가 발생하는 경우 시간 초과가 있어야 합니다.

서버는 AIX/ksh입니다(그러나 그것은 중요하지 않다고 생각합니다.

답변1

여러 컴퓨터에 동시에 로그인하고 여러 컴퓨터에서 일련의 명령을 실행할 수 있는 여러 도구가 있습니다. 다음은 몇 가지입니다:

답변2

당신이 좋아한다면파이썬스크립팅은 bash스크립팅 그 이상입니다.구조귀하에게 적합한 도구일 수도 있습니다.

~에서패브릭 홈 페이지:

Fabric은 애플리케이션 배포 또는 시스템 관리 작업을 위해 SSH 사용을 단순화하도록 설계된 Python(2.5 이상) 라이브러리이자 명령줄 도구입니다.

이는 로컬 또는 원격 셸 명령(일반적으로 또는 sudo를 통해)을 실행하고 파일을 업로드/다운로드하는 기본 작업 세트는 물론 사용자 입력 메시지 표시 또는 실행 중단과 같은 보조 기능을 제공합니다.

일반적인 용도에는 하나 이상의 기능을 포함하는 Python 모듈을 만든 다음 fab 명령줄 도구를 통해 실행하는 것이 포함됩니다.

답변3

pssh나 다른 소프트웨어를 설치할 수 없다고 가정하면 다음과 같이 할 수 있습니다.

tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
    ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
    count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
    wait $pids
    count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"

답변4

매우 기본적인 설정:

for host in $(cat hosts.txt); do ssh "$host" "$command" >"output.$host"; done

인증에 이름/비밀번호를 사용하는 것은 실제로 좋은 생각이 아닙니다. 이를 위해 개인 키를 설정해야 합니다.

ssh-keygen && for host in $(cat hosts.txt); do ssh-copy-id $host; done

관련 정보