Cómo ejecutar sudo con ssh paralelo

Cómo ejecutar sudo con 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

y el método descrito aquí en la discusión de Googlegrupos.google genera el error 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

en el servidor remoto estoy intentando conectar su /var/log/auth.log tiene el siguiente mensaje

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]

Respuesta1

Para proporcionar la contraseña de la manera más segura posible, pruebe esta versión ( psshen CentOS, Fedora y parallel-sshUbuntu, Debian):

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

Actualización (gracias @chutz):

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

y luego adaptarlo a pssh así (actualizado en consecuencia):

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

Utilizo lo mismo para la recopilación ad-hoc de volcados de múltiples servidores. Deja de usar Ctrl+ Ccomo de costumbre. Se mostrará [FAILURE] <HOST> Interrupted, pero eso se debe simplemente a que, de lo contrario, tcpdump se ejecutaría infinitamente: la salida todavía está en la ubicación habitual. La -t 0opción es que la conexión no se agote. También podría usar tmux o screen y recopilar los volcados más 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"

Asegúrese de incluir el usuario ssh correcto y de que se conectó a esos servidores antes. Probar cosas localmente generalmente evita que se desactive toda la flota de servidores. Puede utilizar las direcciones 127.0.0.X en lugar de localhost para aproximar varios hosts.

Respuesta2

¿Has intentado ejecutar esto haciendo eco de la contraseña en el shell?

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

Respuesta3

Me gustaría recomendar mi sencilla herramienta "spssh.sh" (https://github.com/tangruize/spssh), que es simple (sólo 36 sloc) pero bastante útil. A diferencia de paralelo-ssh, spssh.sh es interactivo y admite la ejecución de cmd paralelo/separado. ¡Espero eso ayude!

Respuesta4

Estoy de acuerdo con @satch_boogiecomentarioarriba: úselo ansiblecuando lo necesite SUDOy úselo psshcuando no lo necesite; SUDOen ansiblemi opinión, es más limpio, aunque la configuración inicial es más complicada.

Respuesta corta:Ejemplo de paquete de actualización y mejora con apt:

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

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

Respuesta larga y configuración: En mi situación, estaba usando MacOS localmente para administrar mis máquinas Linux remotas. Hice lo siguiente que puede variar ligeramente si usas Linux:

  1. asegúrese de tener el mismo usuario creado localmente y en todas las máquinas de destino:sudo adduser username
  2. agregue el usuario al grupo SUDO en cada máquina de destino:usermod -aG sudo username
  3. (quizás opcional) Configuraciónssh sin contraseñaaunque no tengo claro si esto es necesario, pero mi entorno ya estaba configurado con esto. Pruebe primero los pasos a continuación, ya que puede que no sea necesario para ssh sin contraseña.
  4. Instale ansible en su máquina local: brew install ansible(o Linux sudo apt install ansible)
  5. cree el archivo de hosts predeterminado para ansible en su máquina local:sudo mkdir /etc/ansible && sudo touch /etc/ansible/hosts
  6. editar el archivosudo nano /etc/ansible/hosts
  7. Agregue las máquinas de destino bajo un grupo (ip o nombre de máquina):
[myservers]
blah1.local
blah2.local
blah3.local
  1. (Opcional) Tenía un segundo usuario en el grupo SUDO en todas las máquinas de destino, por lo que tuve que eliminar temporalmente a este usuario del grupo SUDO para evitar un mensaje (como cuando lo uso me sudo systemctlpide que elija un usuario SUDO):ansible myservers -a "sudo deluser otheruser sudo" --become -K
  2. Ahora ejecute el comando SUDO real que desee. Ejemplo:ansible myservers -a "sudo apt -y update" --become -K
  3. (Opcional) vuelva a agregar el otro usuario al grupo SUDO:ansible myservers -a "sudo adduser otheruser sudo" --become -K

Ahora, cada vez que necesito ejecutar un comando SUDO en varias máquinas, simplemente repito los pasos 8 a 10.

información relacionada