TL; DR: è possibile utilizzare sudo -i
per eseguire una funzione definita /root/.bashrc
(ma non un alias) e inoltre avere accesso alle variabili esportate da quel file:
argomenti del comando sudo -i
Tuttavia, gli alias non funzionano lì, ma puoi facilmente convertirli in funzioni se desideri renderli disponibili sudo -i
.
Continua a leggere per un'analisi completa e maggiori dettagli.
Ci sono alcuni problemi qui, alcuni su come funziona sudo e altri su come funziona bash stesso ...
Per impostazione predefinita, sudo
cercherà solo per i comandi e consentirà di bypassare il guscio, così semplicemente in esecuzione sudo ll
sarà solo lavoro se c'è un ll
eseguibile in una delle directory in $PATH
. Quindi, per usare gli alias (o le funzioni) è necessario assicurarsi che una shell sia invocata come parte del processo.
Un modo sarebbe quello di eseguire qualcosa di simile sudo sh
o sudo bash
, sebbene moderno sudo
(lo sto testando su sudo 1.8.19p1) ha opzioni -s
e -i
per quello scopo.
Quindi un tentativo sarebbe qualcosa di simile sudo -s ll
(che equivale a sudo bash -c 'll'
, supponendo che tu $SHELL
sia Bash, che sembra essere il caso in base a quello che rcfile
hai citato.) Ma neanche questo funziona, poiché avvia la shell in modo non interattivo, modalità non di accesso, che non legge nessuno dei suoi file di avvio. È essenzialmente lo stesso di scrivere uno script di shell e utilizzarlo #!/bin/bash
per eseguirlo. Gli alias (e le funzioni) che hai nel tuo ~/.bashrc
non saranno accessibili da quello script ...
Quindi la prossima -i
opzione è che crea una shell di login. Questo è il più promettente, dal momento che sarà leggere i file di avvio! Eppure, sudo -i ll
(equivalente a sudo bash -l -c 'll'
) non funzionerà ancora. Quindi come è possibile, dato che ha letto la definizione ll
dell'alias?
Bene, la prossima spiegazione qui è che, per impostazione predefinita, bash non espanderà gli alias, tranne quando la shell è interattiva ... Questa shell avviata da sudo -i
(o bash -l
) è una shell di login , ma non è ancora interattiva.
Quindi il prossimo passo è ottenere una shell interattiva , che quindi funzioni :
sudo bash -i -c 'll'
(Avere sia login che interattivo va bene, ovviamente, bash -l -i -c ...
funzionerà.)
Un'altra alternativa è continuare a utilizzare una shell di accesso (non interattiva) ma chiederle esplicitamente di espandere gli alias, quindi funzionerà anche:
sudo bash -l -O expand_aliases -c 'll'
(Il caso in cui bash era interattivo non aveva bisogno di una shell di accesso , poiché questo è sufficiente per leggere i file di inizializzazione, ma questo deve -l
leggerli.)
Queste sono righe di comando abbastanza lunghe ... E richiedono anche che tu citiate l'intero comando shell, quindi se stai chiamando un alias con argomenti, dovrai trasformare tutto ciò in una stringa ... Quindi è un po ' goffo da usare ...
Nota che prima stavo parlando di alias e funzioni ... Era apposta, dal momento che le funzioni in realtà sono molto più convenienti qui. Non hai bisogno di nulla di speciale (come avere una shell interattiva o impostare un'opzione specifica) per eseguire funzioni su una shell, purché tu stia approvando la loro definizione.
Quindi, se definissi ll
una funzione anziché un alias, saresti in grado di usarla direttamente con il -i
collegamento di sudo :
sudo -i ll
E se hai una riga di comando più lunga, con argomenti, puoi passarli direttamente anche qui:
sudo -i ll -C -R /etc
(Confronta con sudo bash -i -c 'll -C -R /etc'
.)
Le funzioni sono anche molto più flessibili e in genere più facili da mantenere ... Di solito è facile convertire un alias in una funzione, l'unico avvertimento è quello di utilizzare sempre "$@"
dove ti aspetteresti di prendere argomenti extra (in genere alla fine del alias.)
Ad esempio, questo alias:
alias ll='ls $LS_OPTIONS -l'
Potrebbe essere trasformato in questa funzione:
ll () {
ls $LS_OPTIONS -l "$@"
}
Sono, per la maggior parte degli scopi, equivalenti. E, come accennato in precedenza, la funzione dovrebbe essere accessibile direttamente da sudo -i
, quindi questo è un ulteriore vantaggio.
Spero che questa risposta e spiegazione siano utili!
/root/.bashrc
ma in realtà ciò che la Q sta cercando sono gli alias da questo file - questo non è possibile per questo - unix.stackexchange.com/questions/1496/… .