¿Cómo usar ssh y sudo juntos en bash?

10

No he podido encontrar una pregunta que describa este escenario específico.

Estoy tratando de ejecutar un script bash muy básico para recuperar el registro de varias máquinas. Estoy ejecutando el script localmente pero necesito acceder a una máquina externa a través de ssh, así como sudo en un usuario privilegiado una vez en esa máquina ...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

Ejecutar esto con sh -x revela que bash se está atascando en la línea 'ssh'. Así que traté de revisar esto:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

Esto también parece detenerse indefinidamente. ¿Hay una mejor solución para este problema? No puedo evitar usar sudo su por lo que puedo decir ...

¡Gracias por cualquier ayuda!

Matt124234
fuente
¿Por qué la votación cerrada? Esta pregunta es sobre el tema: administrar el hardware o el software de servidores, estaciones de trabajo, almacenamiento o redes, herramientas utilizadas para administrar, monitorear o automatizar estos
jlliagre

Respuestas:

5

La forma en que lo logro en mi entorno actual es ejecutar ssh con el -tindicador que fuerza la asignación de tty, y luego ejecutar sudo -u root dentro de él, de la siguiente manera:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

Tengo mi cuenta en sudoers en el lado remoto, por lo que no se requiere contraseña.

Este ejemplo muestra diferentes formas de hacerlo dentro de una sola sesión ssh, incluida la ejecución de múltiples comandos con bash o dentro de una subshell. Tenga en cuenta también que si coloca el código anterior en un script ejecutable, puede pasar argumentos de línea de comando ($ 1 y $ 2) a ssh y estos se expandirán y luego se referenciarán en el lado remoto.

Michael Martinez
fuente
Desafortunadamente porque no administro el servidor remoto, creo que estoy atascado usando sudo su aquí. ¿Eso todavía funcionaría en este formato?
Matt124234
Sí, también funcionará. puede ingresar la contraseña cuando se le solicite.
Michael Martinez
He intentado: ssh -t [email protected] << EOF sudo su - adcentrl egrep 'ERROR \ | WARN' / home / adcentrl / cronjobs / logs / * / * EOF Pero recibí: "Pseudo -terminal no se asignará porque stdin no es una terminal ".
Matt124234
perfectamente bien ignora esa advertencia y continúa. si lo desea, puede desactivar "RequireTty" en / etc / sudoers en el extremo remoto
Michael Martinez
5

Si no quiere o no puede evitar que sudo le pida la contraseña, un simple truco es leerla localmente y almacenarla en una variable local:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF
xpmatteo
fuente
1

Si sudo está configurado para permitir comandos sin contraseña, esto debería hacer lo que desee:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

o

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

dependiendo de si desea que el file.txtarchivo se cree de forma local o remota.

De lo contrario, aquí hay una manera de pasar la contraseña del usuario remoto a sudo:

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"
jlliagre
fuente
Muy interesante. Sin embargo, usar ssh sin -t me dice "no tty present". Agregar -t elimina este error, pero no parece honrar 'sudo su' ya que me pide una contraseña. Esto es específicamente lo que estoy haciendo: ssh -t [email protected] "sudo su - adcentrl -c egrep" ERROR \ | WARN "/ home / adcentrl / cronjobs / logs / * / *" Esto me da: bash : WARN: comando no encontrado [sudo] contraseña para mrhyner:
Matt124234
Lo siento, aparentemente no sé cómo formatear mis comentarios en esta cosa
Matt124234
Supuse que sudo estaba configurado para estar sin contraseña para su cuenta remota.
jlliagre
y te faltan comillas simples adicionales.
jlliagre
Es, lo que me hizo pensar que bash no está honrando el comando ssh por alguna razón. Está actuando como si estuviera tratando de sudo desde mi host local = \
Matt124234