Come eseguire un comando che comporta il reindirizzamento o il piping con sudo?


60

Sto cercando di seguire quelle che presumo siano le migliori pratiche dell'uso di sudo anziché dell'account root.

Sto eseguendo una semplice operazione su file concat come:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Questo non riesce a destra del ">>" è in esecuzione come l'utente normale. Anche l'aggiunta di sudos extra non riesce (comportamento previsto dal piping al comando sudo e non al file).

L'esempio è proprio questo, ma è stato verificato e testato con l'account root.

Risposte:


75

Puoi invocare una nuova shell come root:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Potresti anche semplicemente elevare un processo per scrivere nel file:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
In generale la seconda opzione è più sicura perché solo i teecomandi vengono eseguiti come root, non il comando principale che potrebbe essere complesso e soggetto a comportamenti scorretti. (non nel caso di echo)
pabouk,

19

Un'altra opzione, altrettanto sicura è utilizzare sudo's -iinterruttore per accedere come root:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Ciò segue ancora le regole di best practice poiché l'account root non è effettivamente abilitato come tale ma consente di eseguire operazioni come root in modo sicuro. Da man sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

Un'altra alternativa èsudo bash
starbeamrainbowlabs il

11

Se esprimi il tuo comando senza virgolette singole, puoi inserirlo in virgolette singole ed eseguirlo tramite una shell intermedia.

Per eseguire questo come root:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Scrivi il comando in un modo diverso che non utilizza ':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

Quindi invoca sudo sh -c …:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

In alternativa, per scrivere l'output in un file su cui solo root può scrivere, chiama sudo tee. Passare l' -aopzione da teeaggiungere al file di destinazione, altrimenti il ​​file viene troncato.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

Per ulteriori modifiche di file complessi, è possibile chiamare sudo sed, sudo ed, sudo perl, ...

In alternativa, usa un editor decente e chiamalo sudo. In Emacs, apri /sudo:/etc/conf.d/hwclock. In Vim, chiama :w !sudo tee %per scrivere sul file aperto come root o usa il plugin sudo.vim . Oppure vai dalla fine sudo e chiama sudoedit /etc/conf.d/hwclock.

Oppure puoi cedere al lato oscuro ed eseguire una shell come root.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

Il comando ha esito negativo a causa delle autorizzazioni sul file reindirizzato a. Il reindirizzamento avviene anche prima che sudovenga invocato il comando.

Dovrai assicurarti che sia il root che apre effettivamente il file per la scrittura.

Il modo più semplice per farlo:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

La echopuò essere eseguito come utente ordinario in quanto solo produce una stringa di testo. L' teeutilità dovrà essere eseguita come root e tee -aaggiungerà i dati. Reindirizziamo l'output su /dev/nullperché tee, per impostazione predefinita, duplicherà i suoi dati di input sull'output standard oltre a scrivere nei file indicati.

Con basho qualsiasi shell che capisce "qui-stringhe":

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

Questo è identico in effetti a quanto sopra. Viene modificato solo il modo in cui produciamo la stringa.


Un altro modo leggermente arrotondato per farlo:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

Qui, il reindirizzamento avviene all'interno di una sh -cshell figlio in esecuzione come root.


4

sudo dd of=

Per aggiungere come vuoi:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

o per ricreare il file da zero:

echo inbytes | sudo dd of=outfile

vantaggi:

  • più bello che teeda nessun /dev/nullreindirizzamento
  • più bello che da shallora nessun subshell
  • ddha molte opzioni potenti, ad esempio status=progressper vedere l'avanzamento del trasferimento

Funziona perché sudo inoltra stdin al comando.

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.