Tornando o shell padrão do zsh sem acesso root

52

Estou usando os computadores da minha escola e gostaria de usá- zshlos em vez de bash. Gostaria de torná-lo o shell padrão, mas não consigo executar um comando como $ chsh -s $(which zsh)porque não tenho privilégios de administrador.

Existe uma maneira de colocar algo no meu .bashrcou algo que chama automaticamente zshquando é aberto como uma solução alternativa?

Para esclarecer, zshjá está instalado.

goodcow
fonte
2
Sim, basta adicionar zshno .bashrcarquivo. Logout e login e pronto!
fedorqui
Me desculpe por isso. Mas, para finalizar a pergunta, acabei de colocar zsha primeira linha?
3
Colocar o zsh no .bashrc sempre o executaria mesmo quando bashfor chamado explicitamente. Melhor colocá-lo em seu .bash_profilelugar.
konsolebox
Você pode definir o zsh como seu shell padrão nas preferências do terminal (crie um novo perfil).
Lmaooooo

Respostas:

68

Crie .bash_profileno seu diretório pessoal e adicione estas linhas:

export SHELL=/bin/zsh
exec /bin/zsh -l

Atualização: .profilepode funcionar como uma solução geral quando o shell padrão não é bash. Não tenho certeza se o .profileZsh também pode ser chamado de redundante, mas podemos fazer isso com segurança com uma simples verificação:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

Também podemos usar whichpara obter o caminho dinâmico em zshque se baseia o valor de $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
konsolebox
fonte
E se um administrador Linux (root) alterar seu shell padrão para algo diferente de bash (mas não zsh), por exemplo, ksh? Então .bash_profilenão será referenciado. Que tal colocar isso em seu .profilelugar?
Joshua Huber
@ JoshuaHuber O último teste que fiz, .profilenão funcionou. Também não .profileseria chamado por Zsh? Pode ser redundante. Ainda não verifiquei isso ainda. (Atualização: funcionou agora, não tenho certeza do erro que cometi antes.) Alguma idéia sobre possíveis desvantagens do uso .profile?
konsolebox
11
O @konsolebox Bash apenas origina .profilese .bash_profilenão existir (a menos que você o faça manualmente .bash_profile, é claro). Especificamente, festança fontes o primeiro um dos arquivos [ .bash_profile> .bash_login> .profile] que encontra. Ele procura apenas .profilecomo um recurso de compatibilidade POSIX (Bourne shell).
Pirocrasty
@pyrocrasty De fato. Assim como dito no manual: "Depois de ler esse arquivo, ele procura ~ / .bash_profile, ~ / .bash_login e ~ / .profile, nessa ordem, e lê e executa comandos do primeiro que existe e é legível . "
precisa saber é o seguinte
Ele trabalhou para configurar um novo perfil de terminal com o comando Executar personalizado em vez de meu shell alterado para zsh. .bash_profilee .profilenão funcionou (os arquivos nem foram executados, o Fedora 26 em um computador universitário).
Lmaooooo
12

Normalmente você pode usar chshcomo um usuário não root. Mas é ocasionalmente desativado, geralmente em sites que usam alguma forma de banco de dados de usuários em rede, como NIS e LDAP. Pode haver um ypchsh(NIS) ou chsh.ldap(LDAP).

chshtambém geralmente permite apenas algumas conchas aprovadas , geralmente as listadas em /etc/shells.

Se você não pode usar chshou suas variantes em seu site, organize seu shell de login para execseu shell favorito e defina a SHELLvariável para apontar para seu shell favorito.

  • Se o seu shell de login for sh, dashou ksh: o arquivo que você precisa editar é ~/.profile. Tenha em atenção que este arquivo é lido no início de uma sessão interativa e também por alguns scripts de inicialização de sessão não interativos (por exemplo, para sessões X11), portanto, você deve tomar cuidado: apenas chame exec(que substitui o processo atual) quando o atual shell é interativo. Exceto pelo shell Bourne (o /bin/shSolaris 10 e anterior), você pode dizer que um shell é interativo pela presença de ina lista de opções ( $-).

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi

    Se você quiser que o zsh leia o seu .zprofile, passe a -lopção

  • Se o seu shell de login for bash, você pode prosseguir como acima. Como alternativa, você pode colocar esses comandos ~/.bash_profile. A maioria dos scripts de inicialização de sessão apenas lê ~/.profilee não ~/.bash_profile, mas já vi alguns que são executados no bash e no read .bash_profile, portanto, mesmo assim, você deve tomar cuidado para não chamar execum shell não interativo.

  • Se o seu shell de login for csh ou tcsh, consulte um exemplo em Alterando o Shell Padrão sem os privilégios do chsh ou do administrador

Gilles 'SO- parar de ser mau'
fonte
1

Eu acredito que o comando chshé para esse mesmo propósito. Embora não tenha certeza de que todas as distribuições Linux / Unix suportem isso. Verifique a página do manual chsh.

cinsk
fonte
Alguns sistemas também o têm como passwd -s.
Stéphane Chazelas
1

Se você não pode executar chshporque não possui privilégios de administrador, fale com alguém que o faça .

Provavelmente você não pode usar chshcomo não raiz porque o sistema que você está usando está configurado para que chshnão funcione, por exemplo, porque o sistema usa NIS ou LDAP em vez de apenas o /etc/passwdarquivo. Ou talvez o administrador do seu sistema só queira manter algum controle.

O procedimento para alterar seu shell depende das políticas da sua organização. Pode haver um comando local que faça o que chshnormalmente faz. Ou você pode precisar enviar um tíquete de suporte solicitando uma alteração de shell.

A maioria das outras respostas é boa, mas se os administradores forem razoavelmente responsivos, talvez você não queira se incomodar em invadir seus scripts de inicialização. Eu provavelmente apenas invocaria zsh -lmanualmente depois de fazer login até que o administrador atualize minha conta.

Outra coisa a ter em mente: às vezes, shell diferentes podem usar os mesmos arquivos de inicialização. Por exemplo, she bashtanto pode executar $HOME/.profile, e cshe tcshtanto pode executar $HOME/.logine $HOME/.cshrc(embora os arquivos de inicialização específico do shell como .bashrc, .bash_profilee .tcshrcpode substituir aqueles). Se o seu shell padrão é /bin/cshe você deseja usar /bin/tcsh, a atualização de sua .loginchamada /bin/tcsh -lpode criar um loop infinito. zshnão executa basharquivos de inicialização específicos, portanto, isso não é um problema para você.

A maioria das conchas definir variáveis que identificam quais a Shell você está executando ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Se você estiver escrevendo um código de inicialização para chamar seu shell preferido, não é uma má idéia incluí-lo em um, ifpara que ele seja executado apenas se você ainda não estiver executando esse shell. Usando o código da resposta do konsolebox :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(A complicação adicional de verificar, em "${ZSH_VERSION:-unset}"vez de apenas "$ZSH_VERSION"permitir a possibilidade que você fez set -o unset, uma opção que faz com que uma referência a uma variável indefinida seja um erro.)

Keith Thompson
fonte
1

Eu posso pensar em alguns cenários.

  1. zshnão está /etc/shellsativo e o OP deseja usá-lo sem precisar digitar zshno prompt de comando. Soluções possíveis.

    a) use truques de perfil para executá-lo no login. Isso é tão eficaz quanto alterar o shell.

    b) pedir ao administrador para adicionar zshpara /etc/shellsque você possa chsha ele

    c) implore ao administrador para mudar seu shell. isso não é prudente, porque você perderá a capacidade de entrar ftp. você só pode usar ftpse tiver um shell/etc/shells

  2. usuário deseja escapar de um shell restrito, provavelmente rbashou rsh.

    Se .profilefor editável, PATHpode ser expandido editando-o. Uma vez /binno caminho, você pode começar bashde dentro rsh/rbash, obtendo acesso ao chshcomando para permitir a troca de conchas. Muitos comandos têm escapes de shell que podem ser usados ​​para escapar de um shell restrito e recuperar o acesso a chsh.

  3. chshrealmente não funciona por algum outro motivo. A solução a partir da possibilidade 1 também é uma resposta aqui.

O cenário 2 é o único motivo para realmente alterar o shell padrão (é muito restritivo).

Mandril
fonte
-3

Eu não acho que a resposta fornecida realmente faça zsho shell padrão. Simplesmente altera o shell para zsh assim que o usuário efetua login no seu shell padrão . O usuário ainda fará o login, DEFAULT SHELLmas com isso, o shell mudará parazsh

Para alterar o shell padrão, use:

usermod -s /path/to/shell username 

Você deve ser root para fazer isso.

Caso contrário, a solução alternativa acima será útil.

Adicionado a partir do comentário

chsh -s /path/to/zsh  # considered as standard as compared to usermod

e pode ser invocado pelo usuário para si mesmo.

PradyJord
fonte
4
A pergunta afirma claramente que modificar o banco de dados do usuário do sistema (o bit que você precisa fazer root nesta resposta) não é uma opção.
Caleb
3
chsh -s /path/to/zshé mais padrão e geralmente (mas nem sempre) não requer acesso root, ao contrário do usermodque sempre exige . Portanto, sua resposta tem mais problemas do que o que a pergunta já indica como não está funcionando.
Gilles 'SO- stop be evil'