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

0

Escribí un script de bash para verificar varias configuraciones en un sistema, pero obtengo resultados diferentes 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 deshabilito el detectable en el bluetooth y luego hago eco en la variable en la línea de comandos obtengo el resultado esperado:

Discoverable: No

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

Discoverable: Yes

El script eleva sus privilegios a través de una función interna de sudo, así que comenté el bloque para esa función y volví a ejecutar el script. Esta vez, las cosas funcionaron como debí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 shell (sub) de privilegios elevados causa este problema? ¿Es el problema Terminal, Bash o algo más que ignoro?

    
pregunta labyrinth 05.05.2014 - 20:38

2 respuestas

1

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

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

    
respondido por el labyrinth 07.07.2014 - 17:47
0

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 al script nuevamente.
  2. Todas las funciones siguientes, como doAsRoot deben verificar $USER == root , de lo contrario se ejecutarán en la primera llamada del script al invocar $ USER.
  3. sudoBack se elevará hacia abajo usando sudo -k
  4. Todas las funciones siguientes como discover ahora se ejecutarán como primer $USER

Si invocamos como root como en la respuesta, no hay forma de que IMHO vuelva con sudo -k en ninguna parte del script. Lo probé, pero no pude encontrar ninguno ;-)

    
respondido por el Marco M. von Hagen 09.06.2015 - 21:55

Lea otras preguntas en las etiquetas