Pregunta comando sudo con signo igual (=) se confunde para variable de entorno


Estoy tratando de ejecutar varios comandos a través de sudo, donde el signo igual (=) es una parte del comando. En ciertos casos, parece que sudo confunde ese signo para la configuración y la variable de entorno.

Veo esto en sudo (8) hombre:

Environment variables to be set for the command may also be passed on the command line in the form of VAR=value...

Esto es un problema para mí, por ejemplo, si intento ejecutar un comando como:

sudo -i "cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls"

En realidad entra en un shell raíz en lugar de ejecutar el comando, ya que el comando se malinterpreta. Veo esto en sudo.log:

Apr 29 16:11:40 : my_user : TTY=pts/7 ; PWD=/home/my_user ; USER=root ; ENV=cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls ; COMMAND=/bin/bash

Como puede ver, el comando en realidad se malinterpreta como tratar de establecer ENV.

Si elimino el precedente cd /tmp; funcionará. Sin embargo, para algunas de mis cosas, tengo que ejecutar un discos compactos comando o algo similar primero.

Esto parece ser debido al signo igual que causa sudo pensar que estoy configurando ENV. Si elimino el signo igual (es decir, eliminar -D dfs.replication=2 ), luego funciona y se registra correctamente:

Apr 29 16:08:46 : my_user : TTY=pts/7 ; PWD=/home/my_user ; USER=root ; COMMAND=/bin/tcsh -c cd /tmp; /usr/bin/hadoop fs -ls

Entonces mi pregunta es: ¿Cómo escapo esto? = Carácter, y / o sudo, lee el comando como un comando completo, en lugar de pensar que un signo igual está configurando una variable de entorno.

¡Muchas gracias!


1


origen


cd / tmp; sudo, bla, bla? - mcalex
Yo probaría el doble tablero habitual -- para detener el análisis de los argumentos de la línea de comando primero: sudo -i -- "cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls" (No tengo ningún sistema con la instalación de sudo a mano para poder probarlo yo mismo). Si funciona, estoy feliz de escribir una respuesta. - mpy
mclex - buena idea, pero para algunos comandos necesito el cd estar en sudo, ya que los usuarios no privilegiados no podrán acceder al directorio de lo contrario. - redood
mpy - No he probado tu idea a fondo (dado que ya fui con la respuesta de daBeamer a continuación), pero con una simple prueba parece que también funciona. Gracias - redood


Respuestas:


Tratar ejecutando un comando de shell a través de sudo en lugar de pasar uno directamente. Por ejemplo, haz algo como:

sudo bash -c "cd /root; ls -al"

Por supuesto, este es un ejemplo tonto ya que uno podría simplemente ejecutar sudo ls -al /root, pero con suerte logra entender el mensaje.

Ejecutando un comando de shell es mucho más explícito que pasar uno para sudo utilizando el -i bandera ya que ejecutará el shell asignado a la root usuario en un sistema dado. Además, cualquier posible problema con los archivos de recursos de inicio de sesión de la root usuario se evitan

Bash (o su caparazón preferida) debería analizar el = personaje correctamente Seguí adelante y probé esto en mi extremo para ver si estaba completo y no encontré ningún problema. Si no, sin embargo, solo escapa del = preparándolo con un \ personaje.


0



No estoy seguro de por qué no lo he pensado, ¡pero funciona! Gracias :) - redood