Perché lo stesso comando di bash privilegiato fornisce informazioni diverse dallo script piuttosto che dalla riga di comando?

0

Ho scritto uno script bash per verificare vari config su un sistema, ma ottengo risultati diversi a seconda che venga eseguito direttamente dalla riga di comando o dallo script. Ecco il comando:

bt_discoverable=$(system_profiler SPBluetoothDataType | grep Discoverable)

Se disattivo rilevabile sul bluetooth e poi echo la variabile sulla riga di comando ottengo il risultato previsto:

Discoverable: No

Ma se lo faccio eco subito dopo aver eseguito lo stesso comando da uno script bash, ottengo

Discoverable: Yes

Lo script eleva i suoi privilegi attraverso una funzione interna sudo, quindi ho commentato il blocco per quella funzione e ho eseguito nuovamente lo script. Questa volta, le cose hanno funzionato come dovrebbero. Ecco la funzione di elevazione:

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

Questa funzione è la prima cosa che viene eseguita dallo script, quindi la posizione del codice è un problema.

Perché l'esecuzione in una shell con privilegi elevati (sotto) causa questo problema? Il problema è Terminal, Bash o qualcos'altro di cui sono ignorante?

    
posta labyrinth 05.05.2014 - 20:38
fonte

2 risposte

1

La differenza deriva dal cambiamento nell'ambiente di shell una volta elevato. Non sono sicuro di come scriveresti uno script che spiegherebbe facilmente questa modifica, ma la risposta alla mia domanda iniziale è che devi essere consapevole di tali differenze quando elevi i privilegi.

Grazie a "grazie" per questo lead. Alla fine ho postato questa risposta come risposta, poiché non lo hanno fatto per alcune settimane.

    
risposta data 07.07.2014 - 17:47
fonte
0

Questa è la mia soluzione alternativa

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 salirà a root chiamando di nuovo lo script.
  2. Tutte le funzioni seguenti come doAsRoot devono controllare $USER == root , altrimenti verranno eseguite nella prima chiamata di script come invocando $ USER.
  3. sudoBack si eleva verso il basso usando sudo -k
  4. Tutte le funzioni seguenti come discover verranno ora eseguite come prime $USER

Se invochiamo come root nella risposta, non c'è modo di riportare IMHO con sudo -k in nessuna parte dello script. Ho provato, ma non ho trovato nulla; -)

    
risposta data 09.06.2015 - 21:55
fonte

Leggi altre domande sui tag