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
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 asu
. - 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:
-
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
-
Aggiungi alcuni comandi che solo un
root
osudo
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!
) -
Assegna le autorizzazioni di esecuzione utilizzando:
sudo chmod u+x create_dir.sh
-
Apporta le modifiche in modo che questo script non richieda una password.
-
Apri il
sudoers
file:sudo visudo -f /etc/sudoers
-
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.
-
-
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 disudo chmod u+x create_dir.sh
non è necessaria poiché lutente ha (presumibilmente) la proprietà sulla sua directory home. Poiché lutente può scrivere increate_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 asudo
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 reindirizzaresudo
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 insudoers
) 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.
- Crea uno script di shell in cui chiama il comando senza
sudo
. - 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
). -
Aggiungi leccezione ai sudoer usando visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
. -
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.
/path/to/my/program
fosse uno script Python?.bashrc
)? O anche uno script di shell allinterno di/usr/local/sbin
? Da provare./etc
, ma alcuni sistemi lo mettono altrove. Se ‘ non lo trovi, provaman sudoers
. La posizione locale di quel file dovrebbe essere sostituita conman
pagina al momentosudo
è stato creato per quel sistema.