Alterar o shell do sudo su

13

Sempre que corro sudo sudo meu normal zsh(que usa a estrutura oh-my-zsh ), sou forçado a usar o antigo shell Bourne ( sh) por padrão (obviamente; esse é o comportamento padrão na maioria dos sistemas * nix). Se eu correr zshde dentro shdepois de executar sudo su, recebo o shell Z, mas sem as melhorias do oh-my-zsh.

Existe alguma maneira de alterar o sudo sulançamento do shell zsh? Em caso afirmativo, é possível também ter essa instância de zshinicialização usando oh-my-zsh?

Estou usando o OS X 10.8.4.

Jules
fonte

Respostas:

21

Outra maneira de executar um shell interativo como é o superusuário sudo -s, que usa $SHELLcomo o shell.

Como os comentários na outra resposta mencionada, su -s /path/to/zshnão funciona no OS X.

O OS X também não oferece suporte à alteração de shells de login /etc/passwd, mas você pode usar dscl:

$ dscl . -read /Users/root UserShell
/bin/sh
$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh
$ dscl . -read /Users/root UserShell
/bin/zsh
$ sudo su
My-iMac# echo $0
zsh
My-iMac# exit
$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/sh
$ 

/bin/shnão é mais um shell Bourne na maioria das plataformas. É uma versão do bash compatível com POSIX no OS X e traço no Ubuntu.

Lri
fonte
Isso é o que eu acho que a pergunta queria. É definitivamente o que funcionou para mim; muito obrigado! editar vejo o que ele queria agora - acho que não era isso que ele queria, por isso não posso aprová-lo bastante para esta pergunta, mas acho que você merece uma medalha de qualquer maneira. Você teve a resposta para minha pergunta!
precisa saber é o seguinte
4

Na página de sumanual, há duas maneiras de conseguir isso.


O primeiro método é simplesmente usar o sinalizador -sou --shell(supondo que você esteja usando um SO baseado em * NIX com uma versão suque suporte esse argumento), seguido pelo caminho para o shell de sua escolha. Se o shell passado não puder ser encontrado, ele sureverte para o método a seguir e, na sua falta, tentará chamar /bin/sh.

Por exemplo, você pode forçar o sulançamento zsh(supondo que exista em /bin/zsh) como:

sudo su --shell /bin/zsh

O segundo método é modificar o shell padrão especificado para o rootusuário ( cuidado! ). Isso pode ser feito editando o arquivo /etc/passwde alterando o shell especificado para o rootusuário. Para ver qual shell é especificado por padrão, você pode executar o seguinte comando (assumindo que o superusuário seja root):

sudo grep root /etc/passwd 

O comando deve saída algo como root:x:0:0:root:/root:/bin/bash. Você pode simplesmente mudar o /bin/bash(ou o que estiver definido no seu sistema) para apontar zsh.

Avanço
fonte
3
Como sempre, tenha cuidado ao alterar o shell da raiz. Você não deseja estar no modo de usuário único e ter um shell raiz que precise de / usr quando estiver quebrado. Pelo arrendamento Verifique se o seu novo shell tem dependências não mais do sistema de arquivos do que o que você está substituindo
rico Homolka
Execução sudo su -s /bin/zsh(ou uso --shell) retorna su: illegal option -- s. Estou no OS X 10.8.4; o OS X usa um comando diferente?
Jules
@JulesMazur, qual é o resultado cat /etc/shells? Tecnicamente apenas conchas permitidos nesse arquivo será lançado, embora a sumanpage diz que isso não deve importa se sué chamada pelo root: S
Breakthrough
cat /etc/shellsretorna /bin/zshcomo um shell aceitável.
Jules
2
@JulesMazur, lembre-se de sempre incluir seu sistema operacional para evitar esse tipo de confusão.
terdon
1

Uma maneira mais limpa que também protegerá seu sistema caso seu shell personalizado seja explodido é criar um .profile no diretório inicial do root com:

if [ -x /opt/local/bin/bash ]; then
    SHELL=/opt/local/bin/bash
    export SHELL
    exec /opt/local/bin/bash
else
    echo /opt/local/bin/bash not found using default shell of $SHELL
fi

Apenas mude o caminho para o shell que você deseja, em vez do bash.

cybrhippy
fonte
0

Pode ser feito facilmente com chpass:

$ sudo chpass -s /bin/zsh
user686249
fonte