0 votos

¿Por qué el mismo comando bash privilegiado da información diferente desde script que desde la línea de comandos?

Escribí un bash script para verificar varias configuraciones en un sistema, pero estoy obteniendo diferentes resultados dependiendo de si se ejecuta desde la línea de comandos directamente o desde el script. Aquí está el comando:

bt_discoverable=$(system_profiler SPBluetoothDataType | grep Discoverable)

Si desactivo discoverable en el bluetooth y luego hago eco de la variable en la línea de comandos obtengo el resultado esperado:

Discoverable: No

Pero si me hago eco inmediatamente después de ejecutar el mismo comando desde un bash script, obtengo

Discoverable: Yes

El script eleva sus privilegios a través de una función interna de sudo, así que comenté el bloque de esa función y ejecuté de nuevo el script. Esta vez, las cosas funcionaron como deberían. Aquí está la función de elevación:

RunAsRoot()
{
        if [[ "${USER}" != "root" ]] ; then
                echo
                echo
                echo "***  Type the password for ${USER} and press ENTER  ***"
                echo
                sudo $1 && exit 0
        fi
}
RunAsRoot $0

Esta función es lo primero que ejecuta el script, por lo que la posición del código es un problema.

¿Por qué la ejecución en un (sub)shell con privilegios elevados causa este problema? ¿El problema es Terminal, Bash, o alguna otra cosa que desconozco?

1voto

labyrinth Puntos 125

La diferencia viene del cambio en el entorno del shell una vez elevado. No estoy seguro de cómo se podría escribir un script que diera cuenta de este cambio fácilmente, pero la respuesta a mi pregunta original es que hay que ser consciente de tales diferencias cuando se elevan los privilegios.

Gracias a "thankyour" por esta pista. Finalmente publiqué esto como una respuesta ya que no lo hicieron durante algunas semanas.

0voto

Esta es mi solución

bt_discoverable=$(system_profiler SPBluetoothDataType | grep Discoverable)

sudoMe()
{
    if [[ "${USER}" != "root" ]]; then
    echo "inside...as: $USER"
    sudo $0 && sudoBack

    fi
}

doAsRoot(){
    if [[ "${USER}" == "root" ]]; then
        echo "this as $USER"
    fi
}

sudoBack(){
    if [[ "${USER}" == "root" ]]; then
        echo "reverse...from: $USER"
        sudo -k && exit 0
    fi
}

discover() {
    echo $bt_discoverable
}

sudoMe 
doAsRoot
sudoBack
discover
  1. sudoMe se elevará a root llamando de nuevo al script.
  2. Todas las funciones siguientes como doAsRoot debe comprobar que $USER == root , de lo contrario se ejecutará en la primera llamada de script como invocando a $USER.
  3. sudoBack se elevará hacia abajo usando sudo -k
  4. Todas las funciones siguientes como discover se ejecutará ahora como primera $USER

Si invocamos como Root como en la respuesta, no hay manera IMHO atrás con sudo -k en cualquier parte del script. He hecho pruebas, pero no he encontrado ninguna ;-)

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X