GNU/Linux >> Linux Esercitazione >  >> Linux

Un programma può dire che viene eseguito in sudo?

Soluzione 1:

Sì, ci sono 4 variabili d'ambiente impostate quando un programma è in esecuzione sotto sudo:

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20

Si noti che questi possono essere falsificati semplicemente impostandoli. Non fidarti di loro per qualcosa di critico.

Ad esempio:in questo programma dobbiamo dire all'utente di eseguire qualche altro programma. Se quello attuale è stato eseguito con sudo, lo sarà anche l'altro.

#!/bin/bash

echo 'Thank you for running me.'

if [[ $(id -u) == 0 ]]; then
  if [[ -z "$SUDO_COMMAND" ]]; then
    echo 'Please now run: next_command'
  else
    echo 'Please now run: sudo next_command'
  fi
else  echo 'Error: Sadly you need to run me as root.'
  exit 1
fi

Si noti che verifica solo una variabile SUDO_* se può prima provare che è in esecuzione come root. Anche allora lo usa solo per cambiare del testo utile.

Soluzione 2:

Questo non risponde direttamente alla domanda, ma non credo che qui venga posta la domanda giusta. Mi sembra che il richiedente voglia un programma che agirà in modo diverso presumibilmente se ha determinate autorizzazioni o meno, tuttavia direi che il controllo sudo non è il modo per farlo. Innanzitutto molti sistemi potrebbero non implementare un "sudo", non è assolutamente richiesto su Linux o molti Unix.

Ad esempio, un utente potrebbe essere già connesso come root, rendendo sudo privo di senso o forse il sistema ha utenti non root che hanno ancora le capacità per eseguire l'attività amministrativa che il programma potrebbe voler eseguire. Infine, forse il sistema non ha affatto root o sudo e utilizza invece un sistema di controllo degli accessi obbligatorio con funzionalità diverse e non cattura tutti i superuser in cui sudo. Oppure l'utente potrebbe essere sottoposto a sudo, ma in un account che ha meno autorizzazioni del proprio account per motivi di sicurezza (spesso eseguo codice non attendibile con un utente temporaneo non privilegiato che può solo scrivere su ramdisk per eliminare, non aumentare le mie autorizzazioni ). Nel complesso è una cattiva idea assumere un modello di autorizzazioni specifico come sudo o l'esistenza di root o presumere che un utente sudoed abbia particolari privilegi.

Se vuoi scoprire se hai i permessi per eseguire un'operazione il modo miglioreèdi solito semplicemente provare a farlo quindi controlla errno per problemi di permessi se fallisce o seèun'operazione a più stadi che deve fallire o avere successo puoi verificare se un'operazione funzionerà con funzioni come la funzione di accesso POSIX (fai attenzione alle possibili race condition qui se le autorizzazioni vengono attivamente modificate)

Se inoltre hai bisogno di conoscere l'utente reale dietro sudo puoi usare la funzione getlogin che dovrebbe funzionare per qualsiasi sessione interattiva con un terminale sottostante e ti consentirebbe ad esempio di trovare chi sta "veramente" eseguendo il comando per l'auditing o trova il directory home dell'utente reale per salvare i log.

Infine, se quello che vuoi veramente è scoprire se un utente ha accesso root (sempre una cattiva idea ma meno specifica per l'implementazione) puoi usare getuid per verificare la presenza di un uid pari a 0 e quindi root.

Soluzione 3:

Ci sono due meccanismi che possono essere utilizzati.

  • Il controllo delle variabili d'ambiente può essere simulato in entrambi i modi, ma è il più facile da fare. growisofs non gli piace funzionare con SUDO, quindi annullo le variabili SUDO negli script in cui lo uso. Può essere simulato nell'altro modo. (La variabile SUDO viene anche trasferita nell'ambiente per gli script eseguiti con i comandi at e batch.)
  • Un altro modo per vedere se stai eseguendo sudo è quello di percorrere l'elenco dei processi dal tuo processo genitore fino alla ricerca di sudo. Sarebbe difficile nascondere che stavi correndo sotto sudo in questo modo, ma è più complesso. È ancora possibile fingere di correre sotto sudo.

È più comune verificare se si sta eseguendo come utente appropriato. Il id comando può essere usato per fare questo. Lo script di TomOnTime utilizza il id comando per determinare se sudo potrebbe essere necessario eseguire il comando successivo.

Soluzione 4:

Puoi confrontare l'ID utente effettivo con quello reale.

Ciò non significa strettamente che sta eseguendo undo sudo (potrebbe anche essere setuid'd), ma indica che il programma ha più diritti di quanto l'utente possa aspettarsi. (per esempio in un programma che normalmente viene eseguito senza tali diritti, ma deve essere eseguito con loro durante l'installazione o per installare gli aggiornamenti. Quindi, puoi usarlo per dare un feedback di avviso al riguardo).

Soluzione 5:

Puoi controllare la variabile UID (EUID) effettiva, come segue:

if [[ $EUID -eq 0 ]]; then
    echo "running as root"
else
    echo "not running as root"
fi

Linux
  1. Come eseguire un programma specifico come root senza una richiesta di password?

  2. Esecuzione di app a 32 bit con Linux a 64 bit?

  3. Come posso sapere se mi trovo su uno schermo?

  4. Esecuzione di script di shell in parallelo

  5. Come posso configurare ed eseguire PhantomJS su Ubuntu?

Python può rilevare su quale sistema operativo è in esecuzione?

GDB può modificare il codice assembly di un programma in esecuzione?

Impossibile eseguire Sonar Server perché Elasticsearch non può essere eseguito come root

Esegui il comando cd come superutente in Linux

Come posso sapere in quale limite di utenti mi sto imbattendo?

Docker-compose:impossibile compilare SENZA sudo ma posso eseguire i contenitori senza di esso