병렬 SSH를 사용하여 sudo를 실행하는 방법

병렬 SSH를 사용하여 sudo를 실행하는 방법

리눅스:우분투 14.04.3 LTS

cat /tmp/passfile
ABCxyz123

sshpass -f /tmp/passfile parallel-ssh -I -A -h hostlist.txt "sudo -S ls -l /root" < /tmp/passfile

Google 토론에 설명된 방법구글 그룹스 출력 오류는 다음과 같습니다

[1] 01:07:25 [FAILURE] 10.0.4.194 Exited with error code 255
[2] 01:07:25 [FAILURE] 10.0.4.205 Exited with error code 255

원격 서버에서 /var/log/auth.log에 연결하려고 하면 다음 메시지가 나타납니다.

Sep 24 19:20:52 ubu1401 sshd[5765]: Accepted password for ubuntu from 10.0.4.1 port 55019 ssh2
Sep 24 19:20:52 ubu1401 sshd[5765]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
Sep 24 19:21:26 ubu1401 sshd[5765]: pam_unix(sshd:session): session closed for user ubuntu
Sep 24 19:21:26 ubu1401 sudo: pam_unix(sudo:auth): conversation failed
Sep 24 19:21:26 ubu1401 sudo: pam_unix(sudo:auth): auth could not identify password for [ubuntu]
Sep 24 19:22:25 ubu1401 sshd[5791]: Connection closed by 10.0.4.1 [preauth]

답변1

최대한 안전하게 비밀번호를 제공하려면 이 버전을 사용해 보세요( psshCentOS, Fedora 및 parallel-sshUbuntu, Debian):

stty -echo; printf "Password: "; read PASS; stty echo; echo "${PASS}" | \ ssh <USER>@localhost "sudo -S dmesg"

업데이트(@chutz 덕분에):

read -s -p "Password: "; echo "${REPLY}" | \ ssh <USER>@localhost "sudo -S dmesg"

그런 다음 다음과 같이 pssh에 적용합니다(그에 따라 업데이트):

read -s -p "Password: "; echo "${REPLY}" | \ pssh -H <USER>@localhost -o /tmp/output -I "sudo -S dmesg"

동일한 방법을 사용하여 여러 서버에서 임시로 덤프를 수집합니다. Ctrl이를 중지하려면 평소처럼 +를 사용하세요 C. 표시되지만 [FAILURE] <HOST> Interrupted이는 tcpdump가 무한히 실행되기 때문입니다. 출력은 여전히 ​​일반적인 위치에 있습니다. 이 -t 0옵션은 연결 시간이 초과되지 않도록 하기 위한 것입니다. tmux나 screen을 사용하고 나중에 덤프를 수집할 수도 있습니다.

read -s -p "Password: "; echo "${REPLY}" | \ pssh -h <HOSTFILE> -o /tmp/output -t 0 -I "sudo -S tcpdump -l -nn -vv -i any not port 22"

올바른 SSH 사용자가 포함되어 있는지, 이전에 이러한 서버에 연결한 적이 있는지 확인하세요. 로컬 테스트로 인해 전체 서버 팜이 종료되지 않는 경우가 많습니다. 여러 호스트를 근사화하기 위해 localhost 대신 127.0.0.X 주소를 사용할 수 있습니다.

답변2

쉘에 비밀번호를 에코하여 실행해 보셨나요?

echo "echo 'yourpassword'; sudo -S -c 'ls -l /root'"|pssh -I -H hostlist.txt

답변3

저는 저의 간단한 도구 "spssh.sh"를 추천하고 싶습니다(https://github.com/tangruize/spssh) 간단하지만(단지 36개 sloc) 충분히 유용합니다. 병렬 SSH와 달리 spssh.sh는 대화형이며 병렬/별도 cmd 실행을 지원합니다. 도움이 되었기를 바랍니다!

답변4

동의합니다 @satch_boogie논평위의 방법( ansible필요할 때 사용, SUDO필요하지 않을 때 사용)은 초기 설정이 더 복잡하기는 하지만 더 깔끔한 IMO입니다.psshSUDOansible

짧은 답변:업데이트 및 업그레이드 패키지의 예 apt:

ansible myservers -a "sudo apt -y update" --become -K

ansible myservers -a "sudo apt -y upgrade" --become -K

긴 답변 및 설정: 제 경우에는 MacOS를 로컬로 사용하여 원격 Linux 시스템을 관리하고 있습니다. 나는 다음을 수행했습니다. Linux를 사용하는 경우 약간 다를 수 있습니다.

  1. 로컬 및 모든 대상 컴퓨터에서 동일한 사용자를 생성해야 합니다.sudo adduser username
  2. 각 대상 컴퓨터의 SUDO 그룹에 사용자를 추가합니다.usermod -aG sudo username
  3. (아마도 선택 사항) 설정비밀번호 없는 SSH굳이 이렇게 해야 할지 모르겠지만 환경은 이미 설정되어 있습니다. 비밀번호 없는 SSH가 필요하지 않을 수 있으므로 먼저 다음 단계를 시도해 보세요.
  4. 로컬 머신에 ansible을 설치하십시오: ( brew install ansible또는 linux sudo apt install ansible)
  5. 로컬 컴퓨터에서 ansible에 대한 기본 호스트 파일을 만듭니다.sudo mkdir /etc/ansible && sudo touch /etc/ansible/hosts
  6. 파일 편집sudo nano /etc/ansible/hosts
  7. 그룹(IP 또는 컴퓨터 이름)에 대상 컴퓨터를 추가합니다.
[myservers]
blah1.local
blah2.local
blah3.local
  1. (선택 사항) 모든 대상 컴퓨터의 SUDO 그룹에 두 번째 사용자가 있으므로 프롬프트를 피하기 위해 SUDO 그룹에서 해당 사용자를 일시적으로 제거해야 합니다(예: sudo systemctlSUDO 사용자를 선택하라는 메시지를 사용하는 경우).ansible myservers -a "sudo deluser otheruser sudo" --become -K
  2. 이제 원하는 실제 SUDO 명령을 실행하십시오. 예:ansible myservers -a "sudo apt -y update" --become -K
  3. (선택 사항) SUDO 그룹에 다른 사용자를 다시 추가합니다.ansible myservers -a "sudo adduser otheruser sudo" --become -K

이제 여러 머신에서 SUDO 명령을 실행해야 할 때마다 8~10단계를 반복하면 됩니다.

관련 정보