Se você realmente quiser fazer sudo cd directory
work, você pode definir uma função bash
chamada sudo
que executa um novo shell root quando executada dessa forma, e apenas executa o comando normal sudo
caso contrário. / p>
Como apresentado em outras respostas, a maioria dos usuários não quer se incomodar em fazer isso, mas preferirá:
- Execute
sudo -s
ou sudo -i
se você quiser um shell de login (lembre-se de que um efeito de sudo -i
é para iniciá-lo no diretório inicial do root) ou sudo bash
se você quiser forçar bash
ou ser capaz de passar opções para o shell.
- Execute
cd directory
no novo shell.
- Execute qualquer outra ação que precise ser tomada como root no novo shell.
- Depois de concluído, execute
exit
para deixar o novo shell. É importante não esquecer isso, porque você não quer executar mais ações como root do que você pretende!
Então, se você quiser, pode escrever uma função de shell (ou um script) que execute as duas primeiras ações quando sudo
for seguido por cd
e apenas executar sudo
normalmente. Por favor, não use isso como uma alternativa para aprender porque sudo cd
não tem sucesso , porque se você não entende o que está acontecendo, então você provavelmente será muito confuso por estar em um novo shell (e você pode não entender qualquer mensagem de erro que ocorra).
Aqui está uma maneira de escrever uma função de shell, que também lembra que você está em um novo shell e que você deve exit
sair quando terminar. (Esse lembrete provavelmente será útil para usuários do nível de habilidade any , porque geralmente não estamos acostumados a estar em um novo shell quando um executa sudo
sem -s
, -i
ou o nome de uma shell real como argumento.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "" = 'cd' ]; then
sudo bash -c '
if cd -- ""; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "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:~$
" "$USER" "" >&2
printf "%s: Type \"exit\" once you are done!\n" "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:~$
" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "" # Use as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
Você poderia colocar isso no seu ~/.bashrc
, embora essa seja uma maneira bastante estranha de usar o sudo
que você pode querer ativá-lo ocasionalmente. Nesse caso, é melhor colocá-lo em seu próprio arquivo. Se você criar um arquivo chamado sudo.bash
em seu diretório pessoal com esse conteúdo, poderá disponibilizar a função sudo
- para que ela seja executada em vez do comando sudo
normal - 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 .bashrc
não são executáveis, não marque sudo.bash
executável com chmod
. Isso é realmente uma biblioteca, em vez de um script de shell independente. Se você fez executá-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, essa não é a abordagem que tomei aqui.)
Para verificar se sudo
está atualmente definido como uma função de shell e para ver sua definição atual, se for uma, execute type sudo
. Para desabilitar (ou seja, indefinir) a função, uma vez definida, execute unset -f sudo
. Para executar manualmente o comando regular sudo
diretamente, mesmo se a função do shell estiver definida, execute command sudo
. Note, no entanto, que você não tem para fazer isso, porque essa função sudo
realmente faz isso por si mesma sempre que há mais ou menos de dois argumentos passados ou o primeiro argumento é passado é tudo menos cd
. É por isso que você ainda pode usá-lo da maneira normal que as pessoas usam sudo
.
Note também que a função de shell mostrada acima ainda permite que você passe outros argumentos para sudo
, mas isso evitará que ele trate cd
special . A execução de sudo -u user cd directory
em particular não é suportada, embora você possa estender a função do shell para suportar esse caso. Nem é sudo -i cd directory
. O shell que ele cria é semelhante ao que você obtém com sudo -s
. Na verdade, o código não executa sudo -s
, mas usa sudo bash
, portanto a opção -c
funciona corretamente. Na verdade, ele executa bash
duas vezes quando você passa cd
e um argumento de diretório para ele (e zero vezes caso contrário). Quando você executa sudo cd directory
, primeiro ele extrai um shell bash separado daquele em que você está executando a função sudo
e altera o diretório. Se isso for bem sucedido, substitui o bash shell por um novo e interativo que você pode usar.
Aqui está um exemplo de como essa função shell automaticamente "faz a coisa certa". Observe que sudo ls -A /root
se comporta normalmente. Somente quando eu tentar cd
em um diretório com sudo
é um novo shell criado, e sou lembrado explicitamente do que está acontecendo.
%pre%
Se você tentar sudo cd
em um diretório que você não pode alterar como raiz, você receberá uma mensagem de erro:
%pre%
Eu usei sudo -k
entre invocações nos exemplos acima para mostrar que ele autentica você como root antes tentando alterar o diretório. Mas você não precisa executar sudo -k
. Como a função shell é apenas um wrapper fino para o comando sudo
real , o armazenamento em cache de suas credenciais e outros comportamentos comuns de sudo
ainda funcionam normalmente.
Apesar de funcionar bem e ser legal, admito que sombrear o comando sudo
real com uma função com o mesmo nome é super estranho. A maioria dos usuários provavelmente desejará executar as etapas sudo -s
, cd directory
. Mas no caso de alguém querer isso - e também para demonstrar que é possível - aí está.