it-swarm.it

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

Devo eseguire qualcosa come Sudo senza password, quindi ho usato visudo e l'ho aggiunto al mio file sudoers:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Poi l'ho provato:

$ Sudo /path/to/my/program
[Sudo] password for MYUSERNAME: 

Perché chiede una password? Come posso eseguire/utilizzare i comandi come root con un utente non root, senza chiedere una password?

175
LanceBaynes

Hai un'altra voce nel file sudoers , generalmente situato in /etc/sudoers, che corrisponde anche al tuo utente. La regola NOPASSWD deve essere successiva a quella per poter avere la precedenza.

Fatto ciò, Sudo richiederà normalmente una password per tutti i comandi tranne /path/to/my/program, che ti consentirà sempre di eseguire senza richiedere la password.

97
Warren Young

Se ci sono più voci corrispondenti in /etc/sudoers, Sudo usa l'ultimo. Pertanto, se è possibile eseguire qualsiasi comando con una richiesta password e si desidera poter eseguire un comando specifico senza una richiesta password, è necessario disporre dell'ultima eccezione.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Nota l'uso di (root), per consentire l'esecuzione del programma come root ma non come altri utenti. (Non concedere più autorizzazioni del minimo richiesto a meno che tu non abbia pensato alle implicazioni.)

Nota per i lettori che non eseguono Ubuntu o che hanno modificato la configurazione del Sudo predefinita (il Sudo di Ubuntu è ok per impostazione predefinita) : esecuzione di script Shell con privilegi elevati è rischioso, è necessario partire da un ambiente pulito (una volta avviato Shell, è troppo tardi (vedere Consenti setuid su script Shell ), quindi è necessario Sudo per occuparsene). Assicurati di avere Defaults env_reset in /etc/sudoers o che questa opzione è l'impostazione predefinita in fase di compilazione (Sudo sudo -V | grep env dovrebbe includere Reset the environment to a default set of variables).

[~ # ~] warning [~ # ~] : questa risposta è stata considerata insicura. Vedi i commenti qui sotto

Soluzione completa: I seguenti passaggi ti aiuteranno a ottenere l'output desiderato:

  1. Crea un nuovo file di script (sostituisci create_dir.sh con il nome dello script desiderato):

    vim ~/create_dir.sh
    

    Lo script verrà creato nella home directory dell'utente

  2. Aggiungi alcuni comandi che solo un utente root o Sudo può eseguire come la creazione di una cartella a livello di directory principale:

    mkdir /abc
    

    Nota: Non aggiungere Sudo a questi comandi. Salva ed esci (usando :wq!)

  3. Assegnare le autorizzazioni di esecuzione ad esso utilizzando:

    Sudo chmod u+x create_dir.sh
    
  4. Apporta le modifiche in modo che questo script non richieda una password.

    1. Apri il file sudoers:

      Sudo visudo -f /etc/sudoers
      
    2. Aggiungi la seguente riga alla fine:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Sostituisci ahmad con qualunque sia il tuo nome utente. Assicurati anche che questa sia l'ultima riga. Salva ed esci.

  5. Ora quando esegui il comando aggiungi Sudo prima che sia simile:

    Sudo ./create_dir.sh
    

    Ciò eseguirà i comandi all'interno del file di script senza richiedere una password.

Segui i semplici passaggi indicati qui http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

24
M. Ahmad Zafar

Penso che la tua sintassi sia sbagliata. Almeno io uso quanto segue che funziona per me:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
12
musiKk

Se si desidera evitare di utilizzare Sudo né di modificare il file di configurazione sudoers, è possibile utilizzare:

Sudo chown root:root path/to/command/COMMAND_NAME
Sudo chmod 4775 path/to/command/COMMAND_NAME

Questo renderà il comando eseguito come root senza la necessità di Sudo.

6
linuxgnuru

Se hai una distro come Manjaro, devi prima occuparti di un file che sovrascrive la definizione di/etc/sudoers, puoi eliminarlo o lavorare direttamente con quel file per aggiungere le tue nuove configurazioni.

Questo file è:

Sudo cat /etc/sudoers.d/10-installer

L'UNICO modo per vederlo è nei privilegi di root, non puoi elencare questa directory senza di essa, questo file è specifico di Manjaro, potresti trovare questa configurazione con un altro nome, ma nella stessa directory.

Nel tuo file preferito, puoi aggiungere le seguenti righe per ottenere le configurazioni desiderate:

Ignora l'autenticazione per un gruppo

%group ALL=(ALL) NOPASSWD: ALL

oppure Ignora autenticazione per un utente

youruser ALL=(ALL) NOPASSWD: ALL

oppure Ignora autenticazione un eseguibile per un utente specifico

youruser ALL=(ALL) NOPASSWD: /path/to/executable

NOTA VELOCE: stai aprendo una porta per usare Sudo senza autenticazione, ciò significa che puoi eseguire tutto modificando tutto dal tuo sistema, utilizzandolo con responsabilità.

5
Lyoneel

Verifica che Sudo non sia aliasato. Corri in questo modo

/usr/bin/Sudo /path/to/my/program

Ad esempio un alias Shell come questo:

alias Sudo="Sudo env PATH=$PATH"

può causare questo comportamento.

4
Sepero

Ciò ha risolto il problema per me (ho anche provato alcune delle altre risposte, che avrebbero potuto aiutare):

Lo script che stavo chiamando era in /usr/bin, una directory per la quale non ho i permessi di scrittura (anche se di solito riesco a leggere qualsiasi file lì). La sceneggiatura era chmodded + x (permesso eseguibile), ma non funzionava ancora. Spostando questo file in un percorso nella mia directory home, anziché /usr/bin, Sono stato finalmente in grado di chiamarlo con Sudo senza inserire una password.

Anche qualcosa di cui ho dubitato (chiarendo per i futuri lettori): è necessario eseguire la sceneggiatura come Sudo. Digita Sudo quando chiamando lo script. Non usare Sudo per il comando all'interno del tuo script che necessita effettivamente di root (cambiando la retroilluminazione della tastiera nel mio caso). Forse funziona anche questo, ma non è necessario e sembra una soluzione migliore per non farlo.

2
Luc

Quando esegui il tuo script devi eseguirlo come Sudo /path/to/my/script.

Modifica: In base al tuo commento a un'altra risposta, vuoi eseguirlo da un'icona. Dovrai creare un .desktop file che esegue il programma con Sudo, proprio come sul terminale.

Puoi anche prendere in considerazione l'utilizzo di gtk-Sudo per una richiesta password visiva.

Probabilmente dovresti considerare l'idea che non dovresti eseguire le cose come root e che cambiare il sistema più avanti lungo la strada in modo che non ti servano affatto i permessi di root sarebbe un modo migliore per andare.

2
Caleb

Un'altra possibilità potrebbe essere quella di installare, configurare, quindi utilizzare il comando super per eseguire lo script come

super /path/to/your/script

Se vuoi eseguire un binario eseguibile (es. Che hai compilato in ELF binario da un codice sorgente C) -che è not uno script- come root, potresti prendere in considerazione l'idea di crearlo setuid (e in realtà /bin/login, /usr/bin/Sudo e /bin/su e super utilizzano tutti questa tecnica). Tuttavia, fai molta attenzione, potresti aprire un enorme buco di sicurezza .

Concretamente, il tuo programma dovrebbe essere codificato in modo paranoico (quindi controlla tutti gli argomenti e l'ambiente e le condizioni esterne prima di "agire", assumendo un utente potenzialmente ostile), quindi potresti usare seteuid (2) e amici (vedi anche setreuid (2) ) attentamente (vedi anche capacità (7) & credenziali (7) & execve (2) ...)

Userai chmod u+s (leggi chmod (1) ) durante l'installazione di tale binario.

Ma stai molto attento .

Leggi molte cose su setuid, incluso Advanced Linux Programming , prima di codificare una cosa del genere.

Nota che uno script o qualsiasi cosa Shebang - ed, non può essere impostato. Ma potresti codificare (in C) un piccolo setuid-binario avvolgendolo.

1

Idealmente se stai personalizzando quali comandi possono essere eseguiti tramite Sudo dovresti apportare queste modifiche in un file separato in /etc/sudoers.d/ Invece di modificare direttamente il file sudoers. Dovresti anche usare sempre visudo per modificare i file. Non devi MAI concedere NOPASSWD ai comandi ALL.

Esempio: Sudo visudo -f /etc/sudoers.d/mynotriskycommand

Inserisci la tua linea che concede l'autorizzazione: myuser ALL= NOPASSWD: /path/to/your/program

Quindi salva ed esci e visudo ti avviserà in caso di errori di sintassi.

È possibile eseguire Sudo -l Per vedere le autorizzazioni concesse all'utente, se uno qualsiasi dei comandi NOPASSWD specifici dell'utente appare PRIMA di qualsiasi comando %groupyouarein ALL=(ALL) ALL nell'output, verrà visualizzato richiesto la tua password.

Se ti ritrovi a creare molti di questi file sudoers.d, allora forse vorrai crearli nominati per utente in modo che siano più facili da visualizzare. Tieni presente che l'ordinamento dei NOMI DEI FILE e delle REGOLE all'interno del file è molto importante, quello ULTIMO caricato vince, sia che sia PIÙ o MENO permissivo rispetto alle voci precedenti.

Puoi controllare l'ordine dei nomi dei file usando un prefisso 00-99 o aa/bb/cc, anche se tieni presente che se hai QUALSIASI file che non ha prefisso numerico, verranno caricati dopo i file numerati, sovrascrivendo le impostazioni. Questo perché, a seconda delle impostazioni della lingua, l '"ordinamento lessicale" Shell utilizza prima i numeri di ordinamento e quindi può intercalare lettere maiuscole e minuscole durante l'ordinamento in ordine "crescente".

Prova a eseguire printf '%s\n' {{0..99},{A-Z},{a-z}} | sort E printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort Per vedere se la tua lingua corrente stampa AaBbCc etc o ABC quindi abc per determinare quale sia il migliore "ultimo" "sarebbe il prefisso della lettera da usare.

0
dragon788

In alternativa puoi usare il pacchetto python pudo .

Installazione:

user$ Sudo -H pip3 install pudo # you can install using pip2 also

Di seguito è riportato lo snippet di codice per l'utilizzo in python per l'esecuzione di comandi con privilegio di root:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

Di seguito è riportato l'esempio cmd per l'esecuzione di comandi con privilegio di root:

user$ pudo ls /root
Desktop  Downloads  Pictures  Music
0

Per consentire a qualsiasi utente di eseguire il programma come Sudo senza chiedere la password, è possibile aggiungere la seguente riga

%Sudo ALL=(root) NOPASSWD: /path/to/your/program

in /etc/sudoers

Nota che % Sudo ce la fa.

0
ultimatex

Quanto segue è per il caso in cui si desidera eseguire un comando senza password solo se ha un set specifico di opzioni, in cui una parte delle opzioni è variabile. AFAIK non è possibile utilizzare variabili o intervalli di valori nelle dichiarazioni dei sudoers, ovvero è possibile consentire l'accesso esplicito a command option1 Ma non command option2 Utilizzando:

user_name ALL=(root) /usr/bin/command option1

ma se la struttura è command option1 value1, dove value1 può variare, è necessario disporre di righe esplicite sudoers per ogni possibile valore di value1. Lo script Shell fornisce un modo per aggirarlo.

Questa risposta è stata ispirata dalla risposta di M. Ahmad Zafar e risolve lì il problema di sicurezza.

  1. Creare uno script Shell in cui si chiama il comando senza Sudo.
  2. Salvare lo script in una cartella con privilegi di root (ad es. /usr/local/bin/), Rendere il file di proprietà root (ad es. chown root:wheel /usr/local/bin/script_name) Senza accesso in scrittura per altri (ad es. chmod 755 /usr/local/bin/script_name).
  3. Aggiungi l'eccezione ai sudoers usando visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Esegui il tuo script Sudo script_name.

Ad esempio, voglio cambiare il timeout di sospensione della visualizzazione su macOS. Questo viene fatto usando:

Sudo pmset displaysleep time_in_minutes

Considero cambiare il timeout di sospensione un'azione innocente che non giustifica la seccatura della digitazione della password, ma pmset può fare molte cose e mi piacerebbe tenere queste altre cose dietro la password del Sudo.

Quindi ho il seguente script in /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "Sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

Alla fine del file sudoers ho la seguente riga:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Per impostare il timeout a 3 minuti, eseguo il mio script dall'account utente normale user_name:

Sudo ds 3

PS La maggior parte del mio script è la convalida dell'input, che non è obbligatorio, quindi anche i seguenti funzionerebbero:

#!/bin/bash
pmset displaysleep $1 
0
Koit Saarevet