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 directory
bash
sudo
sudo
Conforme apresentado em outras respostas, a maioria dos usuários não deseja se incomodar com isso, mas deseja:
- Execute
sudo -s
, ou sudo -i
se 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 bash
se desejar forçar bash
ou 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
exit
para 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 sudo
for seguida por cd
e execute sudo
normalmente 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 exit
sair 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 sudo
sem -s
, -i
ou 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 sudo
você só pode querer habilitá-lo ocasionalmente. Nesse caso, é melhor colocá-lo em seu próprio arquivo. Se você criar um arquivo chamado sudo.bash
no diretório inicial com esse conteúdo, poderá disponibilizar a sudo
função - para que ela seja executada em vez do sudo
comando 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 .bashrc
não são executáveis, não marque sudo.bash
executá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 sudo
atualmente 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 sudo
comando 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 sudo
funçã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 cd
especialmente . 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 directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
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 /root
se comporta normalmente. Somente quando tento acessar cd
um 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 cd
acessar 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 -k
entre 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 sudo
comando real , o cache de suas credenciais e outros sudo
comportamentos comuns ainda funcionam normalmente.
Embora funcione bem e seja meio arrumado, admito que sombrear o sudo
comando 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 -l
diretório próprio.