Linux - use “su -” mas mantenha o diretório atual

13

Quando eu faço o su -root, meu diretório atual é definido como home do root. Existe alguma maneira de manter o diretório atual em que eu estava, assim como sudo -s. Ou é a resposta para usar o sudo?

Rory
fonte
5
Observe que eu não quero parecer grosseiro, mas por que esse problema não é resolvido via "man su"?
Myrrdyn 17/06/09
1
@Rory, por favor, leia o comentário de
Myrrdyn
Eu gosto de usar sudo su -c "zsh", no meu caso, me mantém no diretório atual e carrega o zsh como shell com o usuário root. ctrl+ddepois e você volta ao usuário atual. Para o diretório, funciona diretamente em centos para mim, mas talvez adicionar o comando `&& cd $ (pwd)` dentro do comando passado possa fazer o truque.
GabriLouRoux
As documentações do @Myrrdyn são ótimas quando você sabe o que está procurando. Caso contrário, pedir conselhos a especialistas é mais rápido e mais didático.
Romain Vincent

Respostas:

18

É sempre melhor usar o sudo, se possível, porque você não precisa saber (ou dar a alguém) a senha do root. Defina a senha root como algo longo e horrível e, em seguida, tranque-a em um cofre.

Se você quiser negar o acesso de alguém mais tarde, basta remover o acesso ao sudo, em vez de precisar ensinar a todos os outros uma nova senha root.

No entanto - você não precisa usar o parâmetro '-' se não quiser. Você obterá um shell como root, ele não será apenas um shell de login (portanto, não executará o .profile do root).

crb
fonte
1
No meu caso, eu precisava do alias para fazer algo assim asuser git reset --hard. Mas su - <user> -m -c "git reset --hard"e sudo -u <user> git reset --hardsalvaria meu ambiente e o git tentaria ler a configuração do git do usuário atual . Então, eu só queria afirmar que às vezes a solução do user205705 usando su - <user> -c "cd pwd; bash" é melhor.
ReFruity
16

Concordo que o sudo é quase sempre uma resposta melhor, mas responder a outra parte da pergunta ...

O '-' em 'su -' indica que você deseja emular um logon de superusuário, em vez de apenas executar com privilégios de superusuário.

Se você usar 'su' simples em vez de 'su -', permanecerá no mesmo diretório; no entanto, você também estará executando no mesmo ambiente; portanto, pode ser necessário modificar seu caminho para acessar alguns comandos de administrador.

Russell Heilling
fonte
9

Se você usar susem o -, ele deverá mantê-lo em seu diretório atual. -, -lOu --login dizer a su a:

Forneça um ambiente semelhante ao que o usuário esperaria se o usuário efetuasse login diretamente.

Ou apenas use o sudo, ele tem muitas outras vantagens. Ou chaves ssh.

freiheit
fonte
6

Você definitivamente deveria usar o sudo.

su -m
-m (-p): não redefine variáveis ​​de ambiente (geralmente não é recomendado)

Isso o manterá na pasta quando você mudar para o root.

Benefícios do uso do sudo

Jindrich
fonte
1
Não vejo como isso é diferente de apenas "su" por si só, além de possivelmente não redefinir o ambiente PATH, que é um possível problema de segurança.
David Pashley
O @DavidPashley, por exemplo, executa o .bashrcdo usuário externo, não o raiz.
26917 phil294
3

Use sudo :). Sério, você não precisa de su. 'sudo' é melhor, pois você o usa apenas para comandos privilegiados e pode ajudar a evitar erros. Você também recebe responsabilidade.

chmeee
fonte
3

Se você realmente deseja usar su, existe 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
  • -c o que significa "executar um comando no shell do novo
  • -c "cd `pwd`" o comando que damos é alternar para o direcotory atual ( pwd) - mas, como usamos os backticks, o pwdcomando é avaliado antes de executar o sucomando, para que realmente mudemos para o diretório em que estamos no NOW como usuário antigo. 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, e o shell bash não sai até que o encerramos .
will.barley
fonte
Esta é realmente a única resposta para a pergunta. Bom trabalho!
Cacahuete Frito
Na verdade, su - [user] -c "cd $(pwd); bash"pode ser um pouco melhor (mude os backticks para $()).
Cacahuete Frito 09/02
2

Se você usar "su", ele executa um shell interativo. É o mesmo que "sudo -s". "su -" cria um shell de logon, que substituirá o ambiente. "sudo -i" é o equivalente a sudo. Se você estiver tentando obter um shell interativo, sempre use o formulário sudo -i (ou su -), ou é possível obter permissões de arquivo estranhas no diretório inicial do usuário.

David Pashley
fonte
0

você deve modificar a fonte de su para fazer esse trabalho. há uma chamada chdir em um procedimento de inicializar variáveis ​​do ambiente. comentar esses estados incluídos nessa chamada. e agora, você pode executar "su -", mas mantém o diretório atual.


fonte