Permaneça no mesmo diretório de trabalho ao mudar para sudo

25

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?

Restabelecer Monica
fonte

Respostas:

28

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 .

Levon
fonte
1
Lindo! Muito obrigado, visão geral simples, mas excelente!
Reintegrar Monica
@ user1162541 Feliz em poder ajudar.
Levon
sudo -iufunciona para mim ubuntuforums.org/…
rofrol 4/15
Durante o meu teste, os env sudo -iainda estão corrompidos pelos env do usuário. A única maneira de evitar isso é usar su -l.
Simba
5

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 pwdcomando é avaliado antes de executar o sucomando, para que realmente mudemos para o diretório em que estamos agora, como o antigo do utilizador.

    • Por outro lado, -c 'cd `pwd`'executaria o pwdcomando 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 cdcomando. 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.

will.barley
fonte
0

Eu enfrentei o mesmo problema e não tenho permissão para executar outra coisa senão sudo su - devuserno servidor de desenvolvimento, então é isso que eu criei:

  1. 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
  1. 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.

reimai
fonte