sudo con password in una riga di comando?


115

Nei giorni pieni, mi piacerebbe correre

$ ./configure && make && sudo make install && halt

la notte e vai a letto, sperando che l'applicazione venga installata automaticamente. Ma quello che vedo il giorno successivo è lo schermo in cui sudo mi chiede la password. Quindi, come potrei eseguire sudo con password in una riga di comando o c'è qualche altro metodo per farlo?


Devi halteseguire come root.
Keith Thompson,

1
Non sudoha un timeout di 15 minuti? Non potresti eseguire, dire, sudo lso qualcosa di simile, inserire la password e quindi eseguire il comando sopra, con i sudoprivilegi ancora attivi? (Non posso provarlo al momento, altrimenti lo pubblicherei come risposta.)
Matt

1
Il timeout sudoè configurabile. Le persone attente alla sicurezza (alias paranoici, come me) lo hanno impostato su zero ... :-)
dda

Risposte:


173

Sì, utilizzare l' -Sopzione che legge la password da STDIN:

$echo <password> | sudo -S <command>

Quindi per il tuo caso sarebbe simile a questo:

$./configure && make && echo <password> | sudo -S make install && halt

ovviamente, sostituisci <password>con la tua password.


42
Ovviamente, non si vorrebbe eseguirlo se sussiste il pericolo che qualcun altro veda la password nella cronologia della shell.
Brett Daniel,

alla ricerca di modi rapidi per eseguire comandi privilegiati su un host remoto e questo funziona grazie.
nelaaro,

13
Se hai deciso di usare 'echo <password> | sudo -S 'opzione, per evitare di esporre la password nella cronologia dei comandi, avviare il comando con un carattere SPACE. Naturalmente, l'opzione migliore è reindirizzare la password da un file sicuro.
Shannon Haworth,

Potresti volerlo usare se hai la password in $ VARIABLE (che potresti avere un provisioning con sops per esempio)
Natim

9 anni dopo e funziona ancora come un fascino :)
WinEunuuchs2Unix

10

È possibile sostituire la riga di comando con questo:

$sudo su

$./configure && make && make install && halt

Ti verrà richiesta immediatamente la password, quindi il resto dei comandi verrà eseguito come superutente.


8
una versione alternativa (e probabilmente preferita) di questo:sudo sh -c "./configure && make && make install && halt"
Quack Quixote

2
Ma allora tutti i file di compilazione generati non avrebbero le autorizzazioni del superutente? Ciò ti impedirebbe di eseguire ./configure && make come utente normale in seguito.
user45909

Sì, utente45909, hai ragione. Personalmente non ho mai eseguito nuovamente ./configure && make se non dopo aver scaricato comunque un aggiornamento del pacchetto principale, ma probabilmente non sono tipico.
CarlF

10

Molte delle altre soluzioni presentano lo svantaggio di funzionare inutilmente ./configuree makecome root.

Questo è un po 'contorto, ma dovrebbe funzionare:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Nota l'uso di virgolette doppie per consentire $USERl'espansione della shell (non root).

Potrei anche aggiungere un sleep 60prima del haltcomando. A volte ho fatto cose del genere, aspettandomi che il comando venisse eseguito a lungo, ma qualcosa va storto e termina immediatamente; la sleepmi permette di uccidere il comando prima che il sistema si spegne. Oppure puoi usare shutdowncon un argomento time.


9

Puoi anche configurare sudo con visudoper consentire all'utente di usare make come sudo senza password.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9

Impostare HISTIGNORE su " sudo -S "

$ export HISTIGNORE='*sudo -S*'

Quindi passare la password in modo sicuro a sudo:

$ echo "your_password" | sudo -S -k <command>

"HISTIGNORE" significa non salvare questo comando nella cronologia. Questa è la cronologia in memoria o il file "~ / .bash_history".

Ad esempio, di seguito verrà reindirizzato in modo sicuro la password al comando sudo, senza conservare una cronologia della password.

"-S" significa utilizzare stdin per la password,

"-K" significa ignorare le credenziali memorizzate nella cache per forzare sudo a chiedere sempre. Questo è per un comportamento coerente.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

Il rovescio della medaglia del metodo sopra è che se vuoi vedere i comandi che hai eseguito nella cronologia in seguito non ci saranno. Un altro metodo è aggiornare la cache delle credenziali di autenticazione sudo (l'impostazione predefinita è abilitata con un timeout di 5 minuti), quindi eseguire sudo separatamente. Ma il rovescio della medaglia è che devi essere consapevole della cache di 5 minuti.

Per esempio:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

Nota Ho eseguito un sudo prima di ogni comando per assicurarmi che la cache sudo fosse aggiornata, poiché il valore predefinito è 5 minuti. Sì, whoami non dovrebbe richiedere 5 minuti, ma immagino che potrebbe anche essere eseguito prima di ogni comando per coerenza. Puoi anche inserire "export HISTIGNORE = ' sudo -S'"nel tuo file ~ / .bashrc, quindi caricalo con". ~ / .bashrc "o disconnessione, quindi effettua il login. Tuttavia, sto pensando di usarlo per scopi di scripting, quindi lo terrò in cima a tutti i miei script per le migliori pratiche di sicurezza. Impostazione" echo "" | sudo -S -v "su una variabile invece potrebbe anche essere una buona idea, quindi esegui la variabile prima di ogni comando che necessita dei privilegi di root, vedi il commento di Janar. Il commento di" John T "dovrebbe includere anche il parametro" -k " , come se esegui "sudo -S" senza "-k" e la cache di autenticazione sudo abbia già le tue credenziali (ed è ancora valida, la cache di autenticazione sudo predefinita è di 5 minuti), bash eseguirà invece la tua password come comando, che è male.


1
Proprio come una piccola nota su come rendere le cose non disponibili nella storia, esegui il tuo comando con un singolo spazio nella parte anteriore di esso. Per qualche ragione questo fa sì che la storia la ignori.
Matt Fletcher,

4

Nota, ho scoperto che il metodo non funziona su una versione precedente di sudo, in particolare "Sudo versione 1.6.7p5":

$ echo "<your_password>" | sudo -S -k whoami

Dove questo metodo funziona su sudo versioni precedenti e nuove:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami

Questa non è una risposta alla domanda originale. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post: puoi sempre commentare i tuoi post e una volta che avrai una reputazione sufficiente sarai in grado di commentare qualsiasi post .
DavidPostill

@Darren DeHaven: La prego di spiegare come questa diventa la risposta alla domanda posta qui?
Renju Chandran Chingath,

4

Puoi farlo anche tu:

sudo -S <<< "password" command

solo questo funziona per me in mac os.
Mehdico,

2

Se si desidera prestare maggiore attenzione, è possibile creare uno script, modificare le autorizzazioni del file in modo che solo root possa leggere e modificare e quindi eseguirlo.

Esempio:
1) Crea un file:

gedit ~/.easy.install  

2) Incolla questo e salva:

./configure && make && echo <password> | sudo -S make install && halt  

3) Renderlo eseguibile:

sudo chmod +x ~/.easy.install  

4) Modifica le autorizzazioni del file in modo che solo root possa leggerlo e modificarlo:

sudo chmod 700 ~/.easy.install  

5) Esegui:

~/.easy.install  

Godere ;-)


echo <password> verrà comunque visualizzato nell'elenco dei processi e se qualcuno ottiene fortuna con ps aux nel momento esatto giusto, potrà vedere la password in chiaro. Meglio salvare la password in un file e usare <per reindirizzare dal file in sudo.
bobpaul,

1

Configurare sudo in quel modo è pericoloso se qualcuno capisce che sudo non richiede password sul tuo account. A meno che tu non sappia cosa stai facendo, non farlo. L'ho fatto accadere nel mio programma di allenamento A + locale con il mio computer sperimentale troppe volte ... -_-

Ciò che John T. ha detto suona bene però, tranne che c'è ancora il rischio di trovare la password nella cronologia della shell. Ciò che CarlF ha detto suona meglio, ma se un comando fallisce, il computer continuerà a funzionare con i privilegi di superutente.


0

Personalmente faccio lo stesso con cui John T ha risposto il 9 novembre 2009 alle 2:47, ho anche migliorato il mio secondo la guida della sua risposta, grazie.

La differenza è che tendo a fare uso di variabili, qualcosa del tipo:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

In questo modo posso facilmente usare la mia variabile invece di sudo,

$AutoSuDo apt-get update;

Questo è abbastanza utile con alcuni script più lunghi. Li uso principalmente per personal computer di altri, che devo mantenere.

Consiglio anche di prestare attenzione a:

  • desgua risponde il 19 aprile 11 alle 23:56
  • user224306 commenta il 14 maggio 13 alle 17:38 per la risposta di John T il 9 novembre 2009 alle 2:47

0

Il problema è stato risolto Ad esempio, per l'utente root:

echo -e 'password\npassword\n' | sudo passwd root

Cosa fa -e flag, @jerson Martinez?
user674669

1
Il flag -e per l'eco consente di interpretare determinate sequenze con significati speciali.
Jerson Martínez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.