2012-12-02 18 views
6

Vorrei utilizzare la sostituzione di processo bash per un comando sudo.Uso della sostituzione di processo bash per un comando sudo

Per esempio, ecco un comando non sudo che funziona per me:

$ cat <(echo "installed.txt") 
installed.txt 

Ed ecco una versione sudo del comando che non funziona:

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

Leggere la pagina man sudo , sembra che sudo chiuda tutti tranne i descrittori di file stdin/stdout/stderr prima di eseguire il comando come root. Questo mi porta a pensare che bash sta creando il descrittore (e sta eseguendo la sostituzione del processo) prima di eseguire il comando sudo.

Ho modificato la shell di root in bash (invece di sh default). Ho verificato che il comando funzioni correttamente quando si accede come root. Non funziona solo tramite un comando sudo.

Qual è la tecnica appropriata per ottenere ciò che sto cercando di fare qui? Eval, quoting, sudo flag, sudoers file mod, altro?

risposta

6

provare a fare questo nella shell:

$ sudo bash -c 'cat <(echo "installed.txt for UID=$UID")' 
installed.txt for UID=0 
0

L'approccio migliore è probabilmente quello di mettere tutto in uno script ed eseguire quello script con sudo.

+0

Tutto è un one-liner; Mi piacerebbe evitare di doverlo fare. –

+1

@ClaytonStanley Quindi utilizzare le soluzioni fornite nelle altre (molto buone) risposte ... –

3
sudo bash -c 'cat <(echo "installed.txt")' 
+1

Anche questa è la risposta accettata, ma non è stata la prima pubblicazione di esso. –

+0

Entrambi stavamo digitando freneticamente allo stesso tempo! Non puoi vincerli tutti. Più al punto, io non posso vincerli tutti! – emrys57

+0

3 minuti per scrivere una riga? Huh! =) –

4

Il comportamento descritto nella domanda è dovuto alla progettazione di sudo.

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

L'errore si verifica perché sudo ha un comportamento di default che chiude descrittori di file tranne per il campione di ingresso, uscita e l'errore. Come descritto nella pagina man:

Per impostazione predefinita, sudo chiude tutti i descrittori di file aperti diversi da input standard, output standard e errore standard durante l'esecuzione di un comando.

Questo comportamento può essere modificato con l'opzione -C (o --close-from) per specificare un numero descrittore di file di sotto del quale i file non devono essere chiuse. Tuttavia, l'uso di questa opzione deve essere consentito da un amministratore: quanto segue deve essere aggiunto a /etc/sudoers

Defaults closefrom_override 

Con questo in luogo, il comando funzionerà se -C viene utilizzato:

$ sudo -C64 cat <(echo "installed.txt") 
installed.txt 

(qui è stato fornito il numero 64 perché era maggiore dello 63 nel messaggio di errore).

Problemi correlati