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

Devo eseguire qualcosa come sudo senza password, quindi ho usato visudo e lho aggiunto al mio sudoers file:

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

Poi lho provato:

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

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

Answer

Tu hanno unaltra voce nel file sudoers , che di solito si trova in /etc/sudoers , che corrisponde anche al tuo utente. La regola NOPASSWD deve essere successiva a quella affinché abbia 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 chiedere la password.

Commenti

  • funzionerebbe ancora se /path/to/my/program fosse uno script Python?
  • Può il programma invece essere un alias, impostato per bash (cioè in .bashrc)? O anche uno script di shell allinterno di /usr/local/sbin? Da provare.
  • Nikos: no, non può essere un alias. Deve puntare a un percorso reale.
  • sudoers? dove si trova? disponibile a utilizzare la tua risposta (
  • @VasiliiSuricov: ‘ di solito in /etc, ma alcuni sistemi lo mettono altrove. Se ‘ non lo trovi, prova man sudoers. La posizione locale di quel file dovrebbe essere sostituita con man pagina al momento sudo è stato creato per quel sistema.

Risposta

Se ci sono più voci corrispondenti in /etc/sudoers, sudo utilizza lultima. Pertanto, se puoi eseguire qualsiasi comando con una richiesta di password, e vuoi essere in grado di eseguire un particolare comando senza una richiesta di password, hai bisogno delleccezione per ultima.

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

Nota luso di (root), per consentire al programma di essere eseguito come root ma non come altri utenti. (Non dare più permessi del minimo richiesto a meno che tu non abbia pensato alle implicazioni.)

Nota per re utenti che non eseguono Ubuntu o che hanno modificato la configurazione di sudo predefinita (sudo di Ubuntu è ok per impostazione predefinita) : eseguire script di shell con privilegi elevati è rischioso, è necessario iniziare da un ambiente pulito (una volta che il shell è stata avviata, è troppo tardi (vedere Consenti setuid negli script di shell ), quindi è necessario che sudo se ne occupi. Assicurati di avere Defaults env_reset in /etc/sudoers o che questa opzione sia limpostazione predefinita in fase di compilazione (sudo sudo -V | grep env dovrebbe includere Reset the environment to a default set of variables).

Commenti

  • ex per passare a root da jhon con sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Se vuoi consentire comandi arbitrari come root, rendilo john ALL=(ALL) NOPASSWD: all. ‘ non ha senso passare a su.
  • Domanda: devo modificare i permessi del mio script di shell in modo che possa essere modificato e letto solo dallutente root, per sicurezza? ‘ sto pensando a un aggressore che modifichi lo script, che ha tutti i permessi concessi senza bisogno di una password, in modo che faccia quello che vuole. Ovviamente, laggressore può ‘ nemmeno leggere il file sudoers per sapere quali script hanno questo privilegio, ma può comunque provare con tutti i miei script personalizzati una volta che trova la cartella in cui si trovano memorizzati nella speranza che alcuni siano consentiti, o qualcosa del genere.
  • @JeffreyLebowski Se hai una regola sudo che esegue lo script (direttamente o indirettamente), allora ‘ È fondamentale che solo root (o le persone che hanno comunque i privilegi di root) possano scrivere nel file di script, e nella directory contenente il file di script, e nella sua directory principale e così via. ‘ non importa che chiunque possa leggere il file di script (a meno che non contenga una password o qualcosa del genere, ma ‘ è una cattiva idea se ‘ una password dovrebbe essere nel suo file, altrimenti ‘ è troppo rischioso di farla perdere accidentalmente, ad esempio tramite copia- incollando quella sezione del codice in una domanda su questo sito).
  • @alper No. Pochissime cose richiedono il riavvio. Dopo aver modificato sudoers, ‘ non devi fare nulla di speciale: sudo controlla ogni volta.

Risposta

AVVISO : questa risposta è stata ritenuta insicura. Vedi i commenti di seguito

Soluzione completa: I seguenti passaggi ti aiuteranno a ottenere loutput 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 directory home dellutente

  2. Aggiungi alcuni comandi che solo un root o sudo lutente può eseguire come creare una cartella a livello di directory principale:

    mkdir /abc 

    Nota: non aggiungere sudo a questi comandi. Salva ed esci (utilizzando :wq!)

  3. Assegna le autorizzazioni di esecuzione utilizzando:

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

    1. Apri il sudoers file:

      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 lultima riga. Salva ed esci.

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

    sudo ./create_dir.sh 

    Questo eseguirà i comandi allinterno del file di script senza chiedere una password.

Segui il facile passaggi citati qui http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

Commenti

  • Sarebbe meglio se fornissi i passaggi pertinenti qui e utilizzassi il collegamento come backup per informazioni più dettagliate. In questo modo la tua risposta conserva un possibile valore anche se quel link non sarebbe più valido.
  • Questo consiglio non è sicuro. La sudo parte di sudo chmod u+x create_dir.sh non è necessaria poiché lutente ha (presumibilmente) la proprietà sulla sua directory home. Poiché lutente può scrivere in create_dir.sh, hai effettivamente fornito una shell di root gratuita a quellutente.
  • @Lekensteyn che significa anche per qualsiasi programma in esecuzione come utente . Tanto vale semplicemente consentire allutente di eseguire qualsiasi cosa con sudo senza una password.
  • Mi manca qualcosa? Ritengo che lintero chmod non sia necessario, poiché ti affidi a sudo per aumentare i tuoi privilegi.

Risposta

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

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

Commenti

  • Il (ALL) parte è opzionale, lasciarla fuori ha esattamente lo stesso effetto. Tuttavia, sarebbe meglio avere (root), ma la sua assenza ‘ non spiega il problema.
  • +1 per sudo per questo comando e nientaltro! Nessun motivo per rompere lintero sistema …
  • @Johan: Questo era già nella domanda.

Risposta

Se vuoi evitare di dover usare sudo né devi cambiare il file di configurazione di sudoers, puoi usare:

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

Questo farà eseguire il comando come root senza la necessità di sudo.

Commenti

  • Wow, non ho mai sentito parlare di questa soluzione prima, sbalorditivo
  • @RyanNerd: questa non è una soluzione sicura. Non solo lOP ora può eseguire il comando come root senza password, ma chiunque può acquistare ora può eseguire il comando come utente root.
  • ” chmod 4775 nomefile ” è un modo. Secondo, forse il modo migliore per SETUID , senza ridefinire i permessi dellintero file è ” chmod u + s filename ”
  • sudo chmod 005 è sicuro. Non ‘ concedere i permessi di scrittura allutente corrente. Altrimenti chiunque nella tua sessione potrebbe fare qualsiasi cosa con il tuo script.

Rispondi

Se hai una distribuzione 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 

LUNICO modo per vederloè sotto i privilegi di root, non puoi elencare questa directory senza di esso, 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 lautenticazione per un gruppo

%group ALL=(ALL) NOPASSWD: ALL 

o Ignora autenticazione per un utente

youruser ALL=(ALL) NOPASSWD: ALL 

o Ignora autenticazione un eseguibile per un utente specifico

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

NOTA RAPIDA: stai aprendo una porta per utilizzare SUDO senza autenticazione, ciò significa che puoi eseguire tutto ciò che modifica tutto dal tuo sistema, usalo con responsabilità.

Rispondi

Verifica che sudo non sia alias. Esegui in questo modo

/usr/bin/sudo /path/to/my/program 

Ad esempio un alias shell come questo:

alias sudo="sudo env PATH=$PATH" 

potrebbe causare questo comportamento.

Commenti

  • Hai ragione, il mio commento era fuori servizio qui , mi dispiace . Tuttavia sono ‘ incuriosito: come pensi che laliasing modifichi lelaborazione di sudoers da parte di sudo. O stai parlando di reindirizzare sudo a qualcosa che stampa sempre questo messaggio di errore per raccogliere le password? Questo è improbabile che sia il caso qui …
  • Avevo lo stesso problema dellOP. È risultato essere causato dallavere alias sudo="sudo env PATH=$PATH" nel mio ~/.bashrc. Invece di risolverlo da solo e di occuparmi ciecamente dei miei affari, ho inviato la mia risposta come possibile soluzione per chiunque altro si trovi in questo thread.
  • Questo ‘ va bene, ma quando non è ovvio (cosa che in questo caso non è ‘ almeno per alcune persone) è bene inserire una spiegazione nella risposta per fornire un contesto e impedire alle persone di usare ciecamente incantesimi magici. +2 (- (- 1) + +1). 🙂

Risposta

Quando esegui lo script, devi eseguirlo come sudo /path/to/my/script.

Modifica: In base al tuo commento a unaltra risposta, vuoi eseguirlo da unicona. Dovrai creare un file .desktop che esegua il tuo programma con sudo, proprio come sul terminale.

Potresti anche considerare di utilizzare gtk-sudo per una richiesta visiva della password.

Probabilmente dovresti considerare lidea che non dovresti eseguire le cose come root e che cambiare il sistema più in là lungo la strada in modo da non avere bisogno dei permessi di root sarebbe un modo migliore per andare.

Commenti

  • Non creare script di shell setuid . Vedi Consenti setuid negli script di shell .
  • Ho considerato di non menzionarlo nemmeno perché ‘ è una pessima opzione. Lho appena cancellato perché ‘ temo che questo richiedente possa utilizzare il consiglio anche con lavvertenza che si trattava di un cattivo consiglio!

Risposta

Questo ha risolto il problema per me (ho anche provato alcune delle altre risposte, che potrebbero aver aiutato):

Lo script che stavo chiamando era in /usr/bin, una directory per la quale non ho i permessi di scrittura (anche se di solito posso leggere qualsiasi file lì). Lo script era chmodded + x (autorizzazione eseguibile), ma ancora non funzionava. Spostando questo file in un percorso nella mia directory home, invece di /usr/bin, sono finalmente riuscito a chiamarlo con sudo senza inserire una password.

Anche qualcosa che ho dubitato (chiarimento per i futuri lettori): è necessario eseguire lo script come sudo. Digita sudo quando chiami lo script. Non utilizzare sudo per il comando allinterno dello script che ha effettivamente bisogno 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.

Commenti

  • Il secondo paragrafo aveva la risposta al mio problema
  • @MuhammadAhmadZafar Felice ha aiutato!
  • In realtà lutilizzo di sudo allinterno di uno script va benissimo a condizione che tu abbia i diritti appropriati (impostati in sudoers) per eseguire il comando in questione senza password. Rende le cose un po più sicure.
  • potrei davvero usare questa risposta riscritta come un passo dopo passo ‘ ecco come lo fai ‘ piuttosto che come dialogo con le altre risposte
  • @WalrustheCat Buona osservazione. Rileggendo la mia risposta, penso di essere stato un po confuso anchio. In questo momento, però, non ‘ ricordo quale fosse la situazione esatta, quindi non posso ‘ scrivere meglio. Se lo capisci, forse una combinazione di più risposte, invia con tutti i mezzi una nuova risposta!

Risposta

Unaltra possibilità potrebbe essere quella di installare, configurare, quindi utilizzare super per eseguire lo script come

super /path/to/your/script 

Se desideri eseguire un file binario eseguibile (ad esempio, che hai compilato in ELF binario da un codice sorgente C), che è non uno script – come root, potresti considerare di impostarlo setuid (e in realtà /bin/login, /usr/bin/sudo e /bin/su e super utilizzano tutti quella tecnica). Tuttavia, fai molta attenzione, potresti aprire un enorme buco di sicurezza .

In concreto, il tuo programma dovrebbe essere codificato in modo paranoico (quindi controlla tutti gli argomenti e lambiente e le condizioni esterne prima di ” agire “, assumendo un utente potenzialmente ostile), quindi potrebbe utilizzare seteuid (2) e amici (vedi anche setreuid (2) ) con attenzione ( vedi anche funzionalità (7) & credenziali (7) & execve (2) …)

Tu “ll usa chmod u+s (leggi chmod (1) ) quando installi un tale binario.

Ma fai molta attenzione .

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

Notare che uno script, o qualsiasi shebang -ed cosa, non può essere impostato. Ma potresti codificare (in C) un piccolo setuid-binary che lo avvolge.

Tieni presente che su Linux, il codice dellapplicazione interagisce con il kernel Linux utilizzando syscalls (2) . La maggior parte di essi potrebbe non riuscire, vedere errno (3) . Molte applicazioni Linux (ad es. GNU bash , GNU make , GNU gdb , GNOME ) sono open source: puoi scaricare, quindi studiare e contribuire al loro codice sorgente.

Commenti

  • Advanced Linux Programming is a dead link.

Answer

Idealmente se stai personalizzando i comandi che possono essere eseguiti tramite sudo dovresti apportare queste modifiche in un file separato sotto /etc/sudoers.d/ invece di modificare direttamente il file sudoers. Dovresti anche utilizzare sempre visudo per modificare i file. Non dovresti MAI concedere NOPASSWD sui comandi ALL.

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

Inserisci la tua linea di concessione dellautorizzazione: myuser ALL= NOPASSWD: /path/to/your/program

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

Puoi eseguire sudo -l per vedere i permessi che sono stati concessi al tuo utente, se uno specifico utente I comandi NOPASSWD vengono visualizzati PRIMA di qualsiasi comando %groupyouarein ALL=(ALL) ALL nelloutput ti verrà richiesta la password.

Se trovi creando tu stesso molti di questi file sudoers.d, forse vorrai crearli con il nome per utente in modo che siano più facili da visualizzare. Tieni presente che lordine dei NOMI FILE e delle REGOLE allinterno del file è molto importante, vince lULTIMO caricato, sia che sia PIÙ o MENO permissivo rispetto alle voci precedenti.

Puoi controllare lordine dei nomi dei file usando un prefisso di 00-99 o aa / bb / cc, ma tieni anche presente che se hai QUALSIASI file che non ha un prefisso numerico, essi verrà caricato dopo i file numerati, sovrascrivendo le impostazioni. Questo perché, a seconda delle impostazioni della lingua, l “ordinamento lessicale” la shell usa prima i numeri di ordinamento e quindi può alternare le maiuscole e le minuscole quando si ordina 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 ecc o ABC quindi abc per determinare quale sarebbe il miglior prefisso “ultima” lettera da utilizzare essere.

Risposta

Per consentire a qualsiasi utente di eseguire il programma come sudo senza chiedere la password puoi aggiungere la seguente riga

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

in /etc/sudoers

Tieni presente che % sudo ce la fa.

Commenti

  • Sebbene ‘ sia un modo per realizzare una regola sudo, non ‘ t rispondere alla domanda sul perché limpostazione del flag NOPASSWD su questa regola risulta ancora in una richiesta di password. Consulta la risposta accettata per avere unidea del motivo per cui è successo.

Risposta

Quanto segue è per il caso in cui desidera eseguire un comando senza password solo se ha un insieme specifico di opzioni, dove una parte delle opzioni è la variabile . AFAIK non è possibile utilizzare variabili o intervalli di valori nelle dichiarazioni sudoers, ovvero è possibile consentire laccesso esplicito a command option1 ma non a command option2 utilizzando:

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

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

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

  1. Crea uno script di shell in cui chiama il comando senza sudo.
  2. Salva lo script in una cartella con privilegi di root (ad es. /usr/local/bin/), crea il file di proprietà della 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 leccezione ai sudoer usando visudo:

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

  4. Esegui lo script sudo script_name.

Ad esempio, desidero modificare il timeout di sospensione dello schermo su macOS. Questo viene fatto utilizzando:

sudo pmset displaysleep time_in_minutes

Considero la modifica del timeout di sospensione unazione innocente che non “giustifica il fastidio di digitare la password, ma pmset può fare molte cose e mi piacerebbe mantenere queste altre cose dietro la password sudo.

Quindi ho quanto segue 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 dallaccount utente ordinario user_name:

sudo ds 3

PS La maggior parte del mio script è la convalida dellinput, che non è obbligatoria, quindi funzionerebbe anche quanto segue:

 #!/bin/bash pmset displaysleep $1  

Risposta

In alternativa puoi usare python pacchetto pudo .

Installazione:

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

Di seguito è riportato lo snippet di codice da utilizzare nellautomazione Python per eseguire comandi con privilegi 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 lesempio di cmd per lesecuzione di comandi con privilegi di root:

user$ pudo ls /root Desktop Downloads Pictures Music 

Risposta

Nello script sudoers che si trova allinterno di / etc / decommenta la riga indicata di seguito:

#includedir /etc/sudoers.d

Crea un file con qualsiasi nome allinterno della directory /etc/sudoers.d/ e aggiungi il contenuto come indicato nelle risposte massime. Come per tutti gli utenti come root

#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

Questo è il modo più sicuro per eseguire lo script con il permesso di root.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *