스크립트를 통해 sudo 사용자를 사용하여 여러 서버에서 로컬 스크립트 실행

스크립트를 통해 sudo 사용자를 사용하여 여러 서버에서 로컬 스크립트 실행

약 100개의 원격 서버가 있습니다. 터미널 서버를 사용하여 모든 서버를 관리하고 sudo 권한으로 명령을 업데이트하고 실행하고 싶습니다.

다른 테스트 스크립트를 매개변수로 사용하는 기본 스크립트가 필요합니다. 기본 스크립트는 원격 서버 이름이 포함된 호스트 파일을 사용하여 with 루프를 통해 실행됩니다.

테스트 스크립트에는 원격 서버에서 즉시 실행될 실제 sudo 명령이 모두 포함되어 있습니다.

./mainscript hostfile testscript 예를 들어 테스트 스크립트에는 "sudo yum -y update" 또는 일련의 명령이 있을 수 있습니다.

루트로 로그인했다면 이 작업은 쉬울 것 같습니다. 하지만 모든 원격 서버에 대해 sudo 권한을 가진 사용자 "admin"으로 실행하고 싶습니다. 이러한 스크립트는 모두 로컬 터미널 서버에 있습니다.

이를 달성하는 데 필요한 아이디어를 제안해 주세요.

답변1

한 가지 아이디어(아마도 최선은 아닐지라도)는 비밀번호 인증 대신 키 기반 인증을 사용하도록 ssh를 구성하는 것입니다. 모르신다면 이 설명이면 충분할 것 같아요SSH 키 인증

귀하의 테스트 스크립트에 무엇이 포함되어 있는지 또는 그 복잡성이 무엇인지 모르겠습니다. 우리를 보자생각하다이는 /tmp/script_output/ 아래에 출력을 저장하는 상당히 복잡한 스크립트입니다. 이 경우 다음을 제안합니다.

while read -r i
do
   scp $2 admin@remote_server:/tmp/
   ssh -t admin@remote_server /tmp/$2
   ssh admin@remote_server rm /tmp/$2
   scp -r admin@remote_server:/tmp/script_output/ /tmp/
   ssh admin@remote_server rm -rf /tmp/script_output
done < "$1"

그건 그렇고, sudoers에서

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

답변2

나도 얼마 전에 같은 문제에 직면했습니다. 이것이 내 해결책입니다.
https://github.com/maciejkorzen/misc-ruby/blob/master/ssh-batch-upload-sftp-and-run.rb

  • 이 스크립트를 다운로드하세요.
  • 서버 이름과 비밀번호가 포함된 CSV 파일을 만듭니다(로그인은 각 서버에서 동일하다고 가정합니다).
  • 실행할 스크립트를 만듭니다.
  • 내 Ruby 스크립트에서 변수를 조정하고 실행하면 모든 작업이 자동으로 수행됩니다. :-)

답변3

sudo다음을 사용하면 처음에 비밀번호를 한 번만 입력하면서 여러 호스트에서 명령을 실행할 수 있습니다 .sudo

누락된 것은 for 루프 또는 HOSTS변수를 가지고 있는 호스트로 설정하는 것입니다. 스크립트는 temp비밀번호가 포함된 폴더에 파일을 생성 sudo하지만 해당 파일은 즉시 삭제됩니다. 이를 통해 명령은 sudo터미널 창이나 스크립트에 비밀번호를 표시하지 않고 비밀번호를 사용할 수 있습니다 .

#!/bin/bash

if "something" 
 then

 else

cat > /tmp/$HOSTS-pw.sh <<EOS
#!/bin/sh
ssh user@$HOSTS sudo "your command here" <<EOC
$SUDOPW
EOC
EOS

fi

chmod 700 /tmp/$HOSTS-pw.sh
/tmp/$HOSTS-pw.sh >/dev/null
if [ -f /tmp/$HOSTS-pw.sh ]; then rm -f /tmp/$HOSTS-pw.sh; fi

echo "Enter SUDO password:"
read -s SUDOPW

for loop here!

unset SUDOPW
exit 0

답변4

이 상황에는 두 개의 스크립트가 있습니다. 이 스크립트는 runonnodes선택한 서버(서버 목록)에서 모든 SSH 작업을 수행합니다. 다른 이름은 runonnodes_commands각 서버에서 사용할 수 있는 네트워크 공유에 있습니다. 이는 선택한 각 서버에서 실행되는 스크립트입니다.

첫 번째 스크립트에는 runonnodes주로 다음이 포함됩니다.

#!/bin/bash

SELECTEDNODES="node1 node2 node2"

for NODE in $SELECTEDNODES; do
    ssh -t $NODE "sudo su -c /mnt/share/runonnodes_commands"

이렇게 하려면 키 기반 인증(내 공개 키 ~/.ssh/authorized_keys)을 사용하면 됩니다.sudo su

이 스크립트에는 runonnodes_commands파일 복사, 패키지 설치 등 노드에서 수행해야 하는 모든 작업이 포함되어 있습니다.

#!/bin/bash

yum install python

관련 정보