4 votos

¿Proporcionar contraseña sudo sobre ssh utilizando sustitución de proceso Bash?

Mi pregunta puede ser visto como una extensión de Cómo hacer diff a través de ssh? con un pequeño giro.

Medio ambiente

macOS Sierra (10.12.3)
OpenSSH 7.3

Situación de ejemplo

Estoy tratando de imprimir un diff entre los dos archivos, uno de ellos se encuentra en un host remoto y exige sudo para la lectura.

Si este archivo remoto era legible por mi usuario remoto (o si me podría ejecutar el comando con sudo flag NOPASSWD) yo simplemente ejecutar:

diff LOCALFILE <(ssh host 'cat REMOTEFILE')

Sin embargo me es necesario autenticarse con el fin de ejecutar el comando remoto, lo que significa que tengo que asignar un pseudo-terminal con ssh -t, y la siguiente ejecución nunca completa:

diff LOCALFILE <(ssh -t host 'sudo cat REMOTEFILE')

Solución de problemas

ps me muestra que el ssh proceso se detiene:

STAT     TIME   COMMAND
S+    0:00.00   diff LOCALFILE /dev/fd/12
T     0:00.03   ssh -t host sudo cat REMOTEFILE

El ssh proceso no responde a SIGTERM en ese punto, y el descriptor de archivo anterior no existe:

❯ ls -l /dev/fd
total 0
crw--w----  1 me     tty     16,   2 Feb 23 17:36 0
crw--w----  1 me     tty     16,   2 Feb 23 17:36 1
crw--w----  1 me     tty     16,   2 Feb 23 17:36 2
dr--r--r--  1 root   wheel         0 Feb 23 09:33 4

Notas adicionales

Puedo observar el mismo comportamiento en cualquier momento que yo uso ssh -t dentro de un proceso de sustitución, independientemente de si es necesaria una contraseña, o no, a sudo (lo que me dijo entender el uso de la -t es cuestionable si ya de entrada se espera que en el host remoto).

Línea de fondo

Estoy usando diff como un ejemplo aquí, pero mi pregunta es en realidad más general: ¿hay alguna forma de usar un Bash proceso de sustitución junto con un SSH pseudo-terminal de la asignación?

2voto

Jeremy Dover Puntos 278

Puede forzar la sudo para tomar la contraseña desde STDIN mediante la -S opción, según este post de superusuario. Así la sintaxis de diff LOCALFILE <(ssh host 'echo <password> | sudo -S cat REMOTEFILE') debe hacer lo que usted necesita, sin necesidad de una pseudo terminal.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: