Se você realmente deseja fazer o trabalho, pode definir uma função shell chamada que executa um novo shell raiz quando é executada dessa maneira e apenas executa o comando regular caso contrário.sudo cd directorybashsudosudo
Conforme apresentado em outras respostas, a maioria dos usuários não deseja se incomodar com isso, mas deseja:
- Execute
sudo -s, ou sudo -ise você quiser um shell de login (lembre-se de que um dos efeitos sudo -ié iniciá-lo no diretório inicial do root), ou sudo bashse desejar forçar bashou conseguir passar opções para o shell.
- Execute no novo shell.
cd directory
- Execute as ações (outras) que precisam ser tomadas como raiz no novo shell.
- Uma vez feito, corra
exitpara deixar o novo shell. É importante não esquecer isso, porque você não deseja executar mais ações como raiz do que pretende!
Portanto, se você quiser, poderá escrever uma função de shell (ou um script) que execute as duas primeiras dessas ações quando sudofor seguida por cde execute sudonormalmente normalmente. Por favor, não use isso como uma alternativa para aprender por sudo cd que de outra forma não será bem-sucedido , porque se você não entender o que está acontecendo, provavelmente ficará muito confuso por estar em um novo shell (e você poderá não entender nenhuma mensagem de erro que ocorrem).
Aqui está uma maneira de escrever uma função de shell, que também lembra que você está em um novo shell e que deve exitsair dela quando terminar. (Esse lembrete é provável que seja útil para usuários de qualquer nível de habilidade, porque não é geralmente acostumados a estar em um novo shell quando se corre sudosem -s, -iou o nome de um shell real como um argumento.)
# 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
}
Você pode colocar isso no seu ~/.bashrc, embora essa seja uma maneira bastante estranha de usar, e sudovocê só pode querer habilitá-lo ocasionalmente. Nesse caso, é melhor colocá-lo em seu próprio arquivo. Se você criar um arquivo chamado sudo.bashno diretório inicial com esse conteúdo, poderá disponibilizar a sudofunção - para que ela seja executada em vez do sudocomando regular - executando . ~/sudo.bash. Isso entra em vigor no shell atual e em seus shells filhos, mas não em outros. Pela mesma razão que arquivos como .bashrcnão são executáveis, não marque sudo.bashexecutável com chmod. Esta é realmente uma biblioteca, em vez de um script de shell independente. Se você fezexecutá-lo como um script de shell, ele definiria a função ... mas apenas no shell que executou o script, não para você como o chamador. (Claro, você pode escrever um script para isso, que simplesmente não é a abordagem que eu tomei aqui.)
Para verificar e ver se sudoatualmente está definido como uma função shell e para ver sua definição atual, se for uma, execute type sudo. Para desativar (ou seja, indefinir) a função, uma vez definida, execute unset -f sudo. Para executar manualmente o sudocomando regular diretamente, mesmo se a função shell estiver definida, execute command sudo. Observe, no entanto, que você não precisa fazer isso, porque essa sudofunção realmente faz isso sozinha sempre que houver mais ou menos de dois argumentos passados para ela ou o primeiro argumento passado para ela for qualquer coisa menos isso cd. É por isso que você ainda pode usá-lo da maneira normal que as pessoas usam sudo.
Observe também que a função shell mostrada acima ainda permite passar outros argumentos sudo, mas isso impedirá que ela seja tratada cdespecialmente . A execução em particular não é suportada, embora você possa estender a função shell para suportar esse caso. Nem é . O shell que ele cria é semelhante ao que você recebe . Na verdade , o código não é executado , mas é usado , portanto, a opção funciona corretamente. Na verdade, ele é executado duas vezes quando você passa um argumento de diretório (e zero vezes caso contrário). Quando você executa , primeiro ele cria um shell bash separado daquele em que você está executando a função e altera o diretório. Se isso der certo, substituisudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo esse bash shell com um novo e interativo que você pode usar.
Aqui está um exemplo de como essa função de shell automaticamente "faz a coisa certa". Observe que sudo ls -A /rootse comporta normalmente. Somente quando tento acessar cdum diretório sudoé que um novo shell é criado e sou lembrado explicitamente do que está acontecendo.
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 você tentar sudo cdacessar um diretório para o qual não pode mudar mesmo como root, receberá uma mensagem de erro:
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:~$
Eu usei sudo -kentre invocações nos exemplos acima para mostrar que ele se autentica como raiz antes de tentar alterar o diretório. Mas você realmente não precisa se controlar sudo -k. Como a função shell é apenas um invólucro fino para o sudocomando real , o cache de suas credenciais e outros sudocomportamentos comuns ainda funcionam normalmente.
Embora funcione bem e seja meio arrumado, admito que sombrear o sudocomando real com uma função do mesmo nome é super estranho. A maioria dos usuários provavelmente só quero executar as etapas sudo -s, eles mesmos. Mas, caso alguém queira isso - e também para demonstrar que é possível - aí está.cd directory
ls -ldiretório próprio.