Usi sudo su per i comandi?


15

La scorsa notte stavo lavorando allo sviluppo delle mie abilità da riga di comando e ho riscontrato un problema in cui quando ho usato sudo, ho ricevuto un messaggio di errore che diceva "permesso negato". Tuttavia quando ho usato 'sudo su' e sono diventato root il comando ha funzionato.

Perché sudo non ha funzionato in prima istanza?

Era:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

Dall'edizione 2010 di Linux Bible nella sezione sulla configurazione di un server LAMP.


Se non fai un esempio, è difficile risolvere il problema.
LassePoulsen,

1
Considerare sudo -ssopra sudo su.
Jeremy L

Risposte:


18

<,> E >> sono usati per il reindirizzamento input / output per i comandi - che è una caratteristica fornita dalla shell (es. Bash). Quindi, se si digita un comando come quello, sudo cat > /var/www/info.phpla shell che lo riceve come input tenta di aprire il file /var/www/info.phpe fornisce quel file come output standard al sudocomando. Il sudocomando non è nemmeno consapevole se il suo output sta andando su una console o reindirizzato a un file, perché questo è gestito dalla shell che lo invoca.

Se la shell in cui hai digitato il tuo comando è la shell di login o un'altra shell in esecuzione in un terminale con il tuo ID utente, allora ha gli stessi privilegi del tuo ID utente, non quelli di root.

Quindi nel tuo caso, mentre il comando cat viene eseguito come root, la copia del suo output /var/www/info.phpviene tentata dalla shell in esecuzione come un normale utente, che, come previsto, fallisce.

Una soluzione alternativa per tali situazioni è utilizzare il teecomando:

sudo tee /var/www/info.php

Ciò avrà l'effetto previsto di inserire fino a ^ D tutto il testo immesso nella console nel file specificato come parametro.

Un effetto collaterale forse indesiderabile è che teeecheggerà anche l'output sullo stdout, quindi dopo aver digitato ciascuna riga e premuto invio ne teeverrà restituita una copia. Per evitare ciò è possibile utilizzare la seguente variante.

sudo tee /var/www/info.php > /dev/null

I dettagli su teepossono essere ottenuti tramite info teeun terminale.


2

sudo non funziona per i comandi che richiedono autorizzazioni per scrivere un file, ad esempio:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

Spiega nella man-page di sudo.


4
Menzionare che è possibile "sudo -i" o "sudo -s" per ottenere un prompt di root renderebbe questa risposta ancora migliore!
Jorge Castro,

Non c'è pipe nel comando di esempio; c'è un reindirizzamento. Inoltre, "a volte non funziona" sembra trasmettere un comportamento instabile sudo. Come notato nella risposta di koushik, il comportamento è abbastanza prevedibile, coerente e "corretto" per il modello di autorizzazione unix.
msw,

2

Il problema è che la parte "> foo.txt" viene interpretata ed eseguita dall'interprete dei comandi (shell) molto prima dell'esecuzione del comando sudo. Il comando sudo non ha idea di voler reindirizzare il suo output su un file.

L'interprete dei comandi non dispone dell'autorizzazione root (ma alla fine il comando sudo alla fine) quindi non può reindirizzare l'output su foo.txt.


1

Un altro modo per risolvere questo è avviare una subshell con sudo ed eseguire quel comando in quella subshell:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

qui, il comando che "ha sudo" è bash e tutto ciò che viene eseguito ha i permessi di root.

$ 2c, * -pike

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.