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 directorybashsudosudo
Come indicato in altre risposte, la maggior parte degli utenti non vorrà preoccuparsi di farlo, ma preferirà invece:
- Esegui
sudo -so sudo -ise desideri una shell di accesso (ricorda che un effetto di sudo -iè quello di avviarti nella home directory di root), o sudo bashse vuoi forzare basho 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
exitper 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 sudonormalmente 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 exituscirne 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, -io 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 sudoche potresti voler abilitare solo occasionalmente. In tal caso, è meglio inserirlo nel proprio file. Se si crea un file chiamato sudo.bashnella directory home con tali contenuti, è possibile rendere sudodisponibile la funzione, in modo che venga eseguita invece del normale sudocomando, 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 .bashrcnon sono eseguibili, non contrassegnare sudo.basheseguibile 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 sudoattualmente è 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 sudocomando regolare direttamente anche se è stata definita la funzione shell, eseguire command sudo. Si noti, tuttavia, che non è necessario farlo, poiché questa sudofunzione 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 cdspeciale . 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 directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo 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 /rootsi comporta normalmente. Solo quando tento di accedere a cduna directory con sudoviene 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 cdaccedere 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 -ktra invocazioni negli esempi sopra per mostrare che ti autentica come root prima di provare a cambiare directory. Ma in realtà non devi correre sudo -kda solo. Poiché la funzione shell è solo un sottile wrapper per il sudocomando reale , la memorizzazione nella cache delle credenziali e di altri sudocomportamenti comuni funziona ancora normalmente.
Anche se funziona bene ed è un po 'pulito, ammetto che oscurare il vero sudocomando 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 -ldella directory stessa.