Mantenha-se no mesmo diretório de trabalho ao mudar para o sudo

20

Ao trabalhar na linha de comando, mudo frequentemente para sudo usando sudo -i . No entanto, meu diretório de trabalho é alterado automaticamente para /root . Eu nunca quero ir para lá; Eu quero ficar onde eu estava! Como posso conseguir isso?

    
por user 14.06.2012 / 01:25

3 respostas

23

Você poderia usar sudo -s , mas não alteraria seu diretório atual para /root , embora algumas de suas variáveis de ambiente não sejam as mesmas de root.

Esta página dos 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 mais informações básicas sobre o sudo .

    
por 14.06.2012 / 01:40
3

Se você quiser usar su , há uma maneira de permanecer no mesmo diretório.

su - user -c "cd 'pwd'; bash"

O que está acontecendo aqui:

  • su - user = faça login como user
  • -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 backticks entre aspas duplas, o comando pwd é avaliado antes de executar o comando su , então que realmente mudamos para o diretório em que estamos agora como o usuário antigo.

    • Por contraste, -c 'cd 'pwd'' executaria o comando pwd no novo shell, então isso seria avaliado como cd /root , o que, é claro, não conseguiria 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" , que significa "executar bash (novo shell) depois de executar o comando cd . O bash shell não sai até sairmos 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 se tornar difícil de ler.

    
por 16.01.2014 / 08:58
0

Eu enfrentei o mesmo problema e não tenho permissão para executar nada além de sudo su - devuser no servidor dev, então foi isso que eu criei:

  1. No .profile do devuser, volte para a home 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.

    
por 28.02.2015 / 18:13