it-swarm-eu.dev

sudo con password in una riga di comando?

Nei giorni intensi, mi piacerebbe correre

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

la notte e vai a letto, sperando che l'applicazione venisse installata automaticamente. Ma quello che vedo il giorno dopo è lo schermo in cui Sudo mi chiede la password. Quindi, come posso eseguire Sudo con password in una riga di comando o esiste un altro metodo per farlo?

103
Jichao

Sì, utilizzare l'opzione -S 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.

152
John T

È 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.

10
CarlF

Molte delle altre soluzioni hanno lo svantaggio di eseguire inutilmente ./configure e make come root.

Questo è un po 'contorto, ma dovrebbe funzionare:

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

Notare l'uso di virgolette per consentire a $USER di essere espanso dalla shell (non-root).

Potrei anche aggiungere un sleep 60 prima del comando halt. A volte ho fatto cose del genere, aspettandomi che il comando fosse eseguito per un lungo periodo, ma qualcosa va storto e termina immediatamente; sleep mi consente di terminare il comando prima che il sistema si chiuda. Oppure puoi usare shutdown con un argomento time.

10
Keith Thompson

È anche possibile configurare Sudo con visudo per consentire all'utente di utilizzare make come Sudo senza password.

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

Imposta HISTIGNORE su " Sudo -S "

$ export HISTIGNORE='*Sudo -S*'

Poi passa la tua password in sicurezza 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, il sotto condurrà in modo sicuro la password al comando Sudo, senza conservare una cronologia della password.

"-S", significa usare stdin per la password,

"-K" significa ignorare le credenziali memorizzate nella cache per costringere 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

Lo svantaggio del metodo precedente è che se vuoi vedere i comandi che hai eseguito nella cronologia in un secondo momento, non saranno lì. Un altro metodo consiste nell'aggiornare la cache delle credenziali di autenticazione Sudo (l'impostazione predefinita è abilitata con un timeout di 5 minuti), quindi eseguire Sudo separatamente. Ma il lato negativo di questo è che devi essere a conoscenza 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 garantire che la cache di Sudo sia aggiornata, poiché il valore predefinito è 5 minuti. Sì, whoami non dovrebbe impiegare 5 minuti, ma immagino potrebbe anche funzionare prima di ogni comando per coerenza. Puoi anche inserire "export HISTIGNORE = ' - Sudo -S '" nel tuo file ~/.bashrc, quindi caricarlo con ". ~/.Bashrc" o disconnessione, quindi accedere. Tuttavia, sto pensando di utilizzarlo per scopi di scripting, quindi lo terrò in cima a tutti i miei script per le migliori pratiche di sicurezza. Impostare "echo" "| Sudo -S -v" su una variabile potrebbe anche essere una buona idea, quindi basta eseguire la variabile prima di ogni comando che richiede i privilegi di root, vedere il commento di Janar. Il commento di "John T" dovrebbe includere anche il parametro "-k", come se si eseguisse "Sudo -S" senza "-k" e la cache di autenticazione di Sudo ha già le credenziali (ed è ancora valida, la cache di autenticazione di Sudo predefinita è 5 minuti), bash invece eseguirà la tua password come comando, il che è male.

7
user393365

Puoi farlo anche tu:

Sudo -S <<< "password" command
2
Jahid

Nota, ho trovato 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 con le versioni precedenti e nuove di Sudo:

$ echo "<your_password>" | Sudo -S -v
$ Sudo whoami
2
Darren DeHaven

Se vuoi fare più attenzione, puoi 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) Rendilo eseguibile:

Sudo chmod +x ~/.easy.install  

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

Sudo chmod 700 ~/.easy.install  

5) Esegui:

~/.easy.install  

Godere ;-)

2
desgua

Installare Sudo in questo modo è pericoloso se qualcuno ha notato che Sudo non richiede alcuna password sul tuo account. A meno che tu non sappia cosa stai facendo, non farlo. Ho avuto successo nel mio programma di allenamento A + locale con il mio computer sperimentale troppe volte ... -_-

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

1
TimE.

Il problema è risolto Ad esempio, per la radice dell'utente:

echo -e 'password\npassword\n' | Sudo passwd root
0

Personalmente faccio esattamente la stessa cosa che John T ha risposto il 9 novembre 2009 alle 2:47, ho anche migliorato il mio in base alla sua risposta, grazie.

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

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. Uso principalmente questi per personal computer di altri, che devo mantenere.

Raccomando anche di prestare attenzione a:

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