Se vuoi davvero far funzionare, puoi definire una funzione di shell chiamata che esegue una nuova shell di root quando viene eseguita in quel modo, ed esegue semplicemente il comando normale altrimenti.sudo cd directory
bash
sudo
sudo
Come indicato in altre risposte, la maggior parte degli utenti non vorrà preoccuparsi di farlo, ma preferirà invece:
- Esegui
sudo -s
o sudo -i
se desideri una shell di accesso (ricorda che un effetto di sudo -i
è quello di avviarti nella home directory di root), o sudo bash
se vuoi forzare bash
o essere in grado di passare le opzioni alla shell.
- Esegui nella nuova shell.
cd directory
- Esegui qualsiasi (altra) azione debba essere eseguita come root nella nuova shell.
- Una volta fatto, corri
exit
per lasciare la nuova shell. È importante non dimenticarlo, perché non si desidera eseguire più azioni come root di quanto si pensi!
Quindi, se vuoi, puoi scrivere una funzione di shell (o uno script) che esegue le prime due di quelle azioni quando sudo
è seguita da cd
, ed esegue sudo
normalmente altrimenti. Per favore, non usarlo come alternativa all'apprendimento del perché sudo cd
altrimenti non ci riesci , perché se non capisci cosa sta succedendo, probabilmente sarai molto confuso trovandoti in una nuova shell (e potresti non capire alcun messaggio di errore che si verificano).
Ecco un modo per scrivere una tale funzione di shell, che ti ricorda anche che sei in una nuova shell e che dovresti exit
uscirne al termine. (Questo richiamo è probabile che sia utile per gli utenti di qualsiasi livello di abilità, perché non si è generalmente abituati ad essere in una nuova shell quando si corre sudo
, senza -s
, -i
o il nome di un guscio reale come argomento.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
Potresti metterlo nel tuo ~/.bashrc
, anche se questo è un modo abbastanza strano da usare sudo
che potresti voler abilitare solo occasionalmente. In tal caso, è meglio inserirlo nel proprio file. Se si crea un file chiamato sudo.bash
nella directory home con tali contenuti, è possibile rendere sudo
disponibile la funzione, in modo che venga eseguita invece del normale sudo
comando, eseguendo . ~/sudo.bash
. Questo ha effetto nella shell corrente e nelle sue shell secondarie, ma non in altre. Per lo stesso motivo per cui file come .bashrc
non sono eseguibili, non contrassegnare sudo.bash
eseguibile con chmod
. Questa è davvero una libreria, piuttosto che uno script shell autonomo. Se lo hai fattoeseguirlo come uno script di shell, definirebbe la funzione ... ma solo nella shell che ha eseguito lo script, non per te come chiamante. (Certo, puoi scrivere una sceneggiatura per questo, che non è l'approccio che ho adottato qui.)
Per verificare e vedere se sudo
attualmente è definita come una funzione shell e per vedere la sua definizione corrente se è una, eseguire type sudo
. Per disabilitare (cioè annullare la definizione) la funzione una volta definita, esegui unset -f sudo
. Per eseguire manualmente il sudo
comando regolare direttamente anche se è stata definita la funzione shell, eseguire command sudo
. Si noti, tuttavia, che non è necessario farlo, poiché questa sudo
funzione lo fa effettivamente ogni volta che ci sono più o meno di due argomenti passati o il primo argomento passato ad esso è tutt'altro cd
. Ecco perché puoi ancora usarlo nei normali modi in cui le persone usano sudo
.
Nota anche che la funzione di shell mostrata sopra ti consente ancora di passare altri argomenti sudo
, ma questo gli impedirà di trattare in modo cd
speciale . L'esecuzione in particolare non è supportata, sebbene sia possibile estendere la funzione shell per supportare quel caso. Né lo è . La shell che crea è simile a quella che ottieni . Il codice non viene effettivamente eseguito , ma utilizza , quindi l' opzione funziona correttamente. In realtà viene eseguito due volte quando si passa e un argomento di directory ad esso (e zero volte altrimenti). Quando esegui , per prima cosa crea una shell bash separata da quella in cui stai eseguendo la funzione e cambia directory. Se ciò ha esito positivo, sostituiscesudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
quella bash shell con una nuova, interattiva che puoi usare.
Ecco un esempio di come quella funzione di shell automaticamente "fa la cosa giusta". Si noti che sudo ls -A /root
si comporta normalmente. Solo quando tento di accedere a cd
una directory con sudo
viene creata una nuova shell e mi viene ricordato esplicitamente cosa sta succedendo.
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
Se si tenta di sudo cd
accedere a una directory che non è possibile modificare nemmeno come root, verrà visualizzato un messaggio di errore:
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
Ho usato sudo -k
tra invocazioni negli esempi sopra per mostrare che ti autentica come root prima di provare a cambiare directory. Ma in realtà non devi correre sudo -k
da solo. Poiché la funzione shell è solo un sottile wrapper per il sudo
comando reale , la memorizzazione nella cache delle credenziali e di altri sudo
comportamenti comuni funziona ancora normalmente.
Anche se funziona bene ed è un po 'pulito, ammetto che oscurare il vero sudo
comando con una funzione con lo stesso nome è super strano. Probabilmente la maggior parte degli utenti vorranno solo per eseguire la procedura sudo -s
, se stessi. Ma nel caso qualcuno lo voglia - e anche per dimostrare che è possibile - eccolo.cd directory
ls -l
della directory stessa.