Como executar o sudo com ssh paralelo

Como executar o sudo com ssh paralelo

Linux: Ubuntu 14.04.3LTS

cat /tmp/passfile
ABCxyz123

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

e o método descrito aqui na discussão do Googlegrupos.google gera o erro como:

[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

no servidor remoto estou tentando conectar seu /var/log/auth.log tem a mensagem abaixo

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]

Responder1

Para fornecer a senha da forma mais segura possível, experimente esta versão ( psshno CentOS, Fedora e parallel-sshno Ubuntu, Debian):

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

Atualização (obrigado @chutz):

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

e depois adapte-o para pssh assim (atualizado em conformidade):

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

Eu uso o mesmo para coleta ad hoc de dumps de vários servidores. Pare de usar Ctrl+ Ccomo de costume. Ele será exibido [FAILURE] <HOST> Interrupted, mas isso ocorre apenas porque o tcpdump seria executado infinitamente - a saída ainda está no local normal. A -t 0opção é para que a conexão não expire. Eu também poderia usar tmux ou screen e coletar os despejos mais tarde.

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"

Certifique-se de incluir o usuário ssh correto e de ter se conectado a esses servidores antes. Testar coisas localmente geralmente evita a desativação de toda a frota de servidores. Você pode usar os endereços 127.0.0.X em vez de localhost para aproximar vários hosts.

Responder2

você tentou executar isso ecoando a senha no shell?

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

Responder3

Eu gostaria de recomendar minha ferramenta simples "spssh.sh" (https://github.com/tangruize/spssh) , que é simples (apenas 36 sloc), mas bastante útil. Ao contrário do paralelo-ssh, spssh.sh é interativo e oferece suporte à execução de cmd paralelo/separado. Espero que ajude!

Responder4

Eu concordo com @satch_boogieComenteacima - use ansiblequando precisar SUDOe psshquando não precisar - é mais limpo SUDOno ansibleIMO, embora a configuração inicial seja mais complicada.

Resposta curta:Exemplo de atualização e atualização de pacote com apt:

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

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

Resposta longa e configuração: Na minha situação, eu estava usando MacOS localmente para gerenciar minhas máquinas Linux remotas. Fiz o seguinte, que pode variar um pouco se você estiver usando Linux:

  1. certifique-se de ter o mesmo usuário criado localmente e em todas as máquinas de destino:sudo adduser username
  2. adicione o usuário ao grupo SUDO em cada máquina de destino:usermod -aG sudo username
  3. (talvez opcional) Configuraçãossh sem senhaembora não esteja claro se isso é necessário, mas meu ambiente já estava configurado com isso. Tente as etapas abaixo primeiro, pois pode não ser necessário para o ssh sem senha.
  4. Instale o ansible na sua máquina local: brew install ansible(ou linux sudo apt install ansible)
  5. crie o arquivo hosts padrão para ansible em sua máquina local:sudo mkdir /etc/ansible && sudo touch /etc/ansible/hosts
  6. edite o arquivosudo nano /etc/ansible/hosts
  7. Adicione as máquinas de destino em um grupo (ip ou nome da máquina):
[myservers]
blah1.local
blah2.local
blah3.local
  1. (Opcional) Eu tinha um segundo usuário no grupo SUDO em todas as máquinas de destino, então tive que remover temporariamente esse usuário do grupo SUDO para evitar um prompt (como quando ele sudo systemctlpede para escolher um usuário SUDO):ansible myservers -a "sudo deluser otheruser sudo" --become -K
  2. Agora execute o comando SUDO real que você deseja. Exemplo:ansible myservers -a "sudo apt -y update" --become -K
  3. (Opcional) adicione novamente o outro usuário ao grupo SUDO:ansible myservers -a "sudo adduser otheruser sudo" --become -K

Agora, sempre que preciso executar um comando SUDO em máquinas, simplesmente repito as etapas 8 a 10.

informação relacionada