
Ao trabalhar na linha de comando, muitas vezes mudo para sudo usando sudo -i
. No entanto, meu diretório de trabalho muda automaticamente para /root
. Eu nunca quero ir para lá; Quero ficar onde estava! Como posso conseguir isso?
Responder1
Você poderia usar sudo -s
, em vez disso, não alteraria seu diretório atual para /root
, embora algumas de suas variáveis de ambiente não fossem as de root.
Essepáginados Fóruns do Ubuntu tem 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 maisinformações básicas sobre sudo.
Responder2
Se você quiser usar su
, existe uma maneira de permanecer no mesmo diretório.
su-do utilizador-c "cd `pwd`; bash"
O que está acontecendo aqui:
su - user
= faça login comouser
-c
que significa "executar um comando no shell do novo usuário"-c "cd `pwd`"
o comando que damos é mudar para o diretório atual (`pwd`
) - mas como usamos os crases entre aspas duplas, opwd
comando é avaliado antes de executarmos osu
comando, para que realmente mudemos para o diretório em que estamos AGORA como o antigo do utilizador.- Por outro lado,
-c 'cd `pwd`'
executaria opwd
comando no novo shell, então isso seria avaliado comocd /root
, o que, é claro, não resultará em nada.
O único problema aqui é que o novo shell sai logo após a execução do comando, então adicionamos:
- Por outro lado,
-c "cd `pwd`; bash"
o que significa "executarbash
(novo shell) após executar ocd
comando. O shell bash não sai até que efetuemos logout dele.
Observe que você pode substituir `pwd`
por $(pwd)
. Eles são funcionalmente iguais, mas a abundância de caracteres semelhantes a citações pode tornar-se difícil de ler.
Responder3
Eu enfrentei o mesmo problema e não tenho permissão para executar nada além sudo su - devuser
do servidor de desenvolvimento, então foi isso que descobri:
- No .profile do devuser, volte para a página inicial do usuário anterior, se encontrado:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
- Um script para determinar um usuário anterior. O script é colocado no diretório bin do devuser:
#!/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.
Responder4
Se ambos os usuários tiverem acesso ao diretório de trabalho:
sudo su -- $USER
Observe que se você se tornar um usuário que não tem acesso ao diretório de trabalho, o novo usuário não poderá realizar nenhuma operação de leitura/gravação nele.
Ou apenas para ser root no diretório de trabalho:
sudo su --