병렬 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 토론에 설명된 방법그룹스.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하고 pssh필요하지 않을 때 사용합니다. 초기 설정이 더 복잡하지만 IMO SUDO에서는 더 깔끔합니다.ansible

짧은 답변:다음을 사용하여 패키지 업데이트 및 업그레이드 예 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단계를 반복하면 됩니다.

관련 정보