Ao trabalhar na linha de comando, geralmente mudo para sudo usando sudo -i
. No entanto, meu diretório de trabalho muda automaticamente para /root
. Eu nunca quero ir para lá; Eu quero ficar onde estava! Como posso conseguir isso?
Ao trabalhar na linha de comando, geralmente mudo para sudo usando sudo -i
. No entanto, meu diretório de trabalho muda automaticamente para /root
. Eu nunca quero ir para lá; Eu quero ficar onde estava! Como posso conseguir isso?
Respostas:
Você poderia usar sudo -s
, em vez disso, ele não mudaria seu diretório atual para /root
, embora algumas de suas variáveis de ambiente não fossem as do root.
Esta página dos fóruns do Ubuntu possui um bom resumo:
Summary of the differences found
corrupted by user's
HOME=/root uses root's PATH env vars
sudo -i Y Y[2] N
sudo -s N Y[2] Y
sudo bash N Y[2] Y
sudo su Y N[1] Y
Esta página da documentação do Ubuntu tem muito mais informações sobre o sudo .
sudo -iu
funciona para mim ubuntuforums.org/…
sudo -i
ainda estão corrompidos pelos env do usuário. A única maneira de evitar isso é usar su -l
.
Se você deseja usar su
, existe uma maneira de permanecer no mesmo diretório.
su - usuário -c "cd` pwd`; bash "
Oque esta acontecendo aqui:
su - user
= faça login como user
-c
o que significa "executar um comando no shell do novo usuário"-c "cd `pwd`"
o comando que damos é alternar para o diretório atual ( `pwd`
) - mas, como usamos os backticks entre aspas duplas, o pwd
comando é avaliado antes de executar o su
comando, para que realmente mudemos para o diretório em que estamos agora, como o antigo do utilizador.
-c 'cd `pwd`'
executaria o pwd
comando no novo shell, para avaliar isso cd /root
, o que, é claro, não realizará nada.O único problema aqui é que o novo shell sai logo após a execução do comando, então adicionamos:
-c "cd `pwd`; bash"
o que significa "executar bash
(novo shell) depois de executar o cd
comando. O shell bash não sai até que o encerramos .Observe que você pode substituir `pwd`
por $(pwd)
. Eles são funcionalmente iguais, mas a abundância de caracteres parecidos com aspas pode se tornar difícil de ler.
Eu enfrentei o mesmo problema e não tenho permissão para executar outra coisa senão sudo su - devuser
no servidor de desenvolvimento, então é isso que eu criei:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
#!/bin/bash
#brings you back home after sudo su
function get_owner {
pid=$1
echo $(ps ouid -p $pid h | tr -d ' ')
}
pid=$$
my_uid=$(get_owner $pid)
uid=$my_uid
i=0
while [[ $uid == $my_uid && $i -lt 20 ]] ; do
pid=$(ps -o ppid= $pid)
uid=$(get_owner $pid)
i=$((i+1))
done
user_home=$(getent passwd $uid | cut -d ':' -f '6')
if [[ -d $user_home && $uid != 0 ]] ; then
echo $user_home
fi
Ele sobe em uma árvore de processos e verifica se o usuário proprietário do processo foi alterado.