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

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

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
  • -cque 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, o pwdcomando é avaliado antes de executarmos 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, então isso seria avaliado como cd /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:

  • -c "cd `pwd`; bash"o que significa "executar bash(novo shell) após executar o cdcomando. 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 - devuserdo servidor de desenvolvimento, então foi isso que descobri:

  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.

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

informação relacionada