Fazendo shell padrão zsh sem acesso root

47

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

Existe alguma maneira de colocar algo em .bashrc ou algo que chame automaticamente zsh quando ele abrir como uma solução alternativa?

Para esclarecer, zsh já está instalado.

    
por goodcow 10.06.2014 / 15:43

6 respostas

57

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

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

Atualização: .profile pode funcionar como uma solução geral quando o shell padrão não é bash. Eu não tenho certeza se .profile pode ser chamado por Zsh também que ele poderia ser 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 which para obter o caminho dinâmico de zsh , que depende do valor de $PATH :

export SHELL='which zsh'
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
    
por 10.06.2014 / 15:50
10

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

chsh normalmente também permitirá apenas alguns shells aprovados , normalmente os listados em /etc/shells .

Se você não puder usar chsh ou suas variantes em seu site, organize seu shell de login em exec seu shell favorito e defina a variável SHELL para apontar para seu shell favorito.

  • Se o seu shell de login for sh , dash ou ksh : o arquivo que você precisa editar é ~/.profile . Tenha em atenção que este ficheiro é lido no início de uma sessão interactiva, bem como por alguns scripts de arranque de sessão não interactivos (por exemplo, para sessões X11), pelo que deve tomar cuidado: chame apenas exec (que substitui o processo actual) quando o shell atual é interativo. Com exceção do shell Bourne (o /bin/sh do Solaris 10 e anterior), você pode dizer que um shell é interativo pela presença de i na 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 seu .zprofile , passe a opção -l .

  • Se o seu shell de login for bash , você pode proceder como descrito acima. Como alternativa, você pode colocar esses comandos em ~/.bash_profile . A maioria dos scripts de inicialização de sessão leu apenas ~/.profile e não ~/.bash_profile , mas eu vi alguns que são executados no bash e leem .bash_profile , então mesmo você deve ter cuidado para não chamar exec em um shell não interativo .

  • Se o seu shell de login for csh ou tcsh, veja um exemplo em Alterando o shell padrão sem chsh ou privilégios de administrador

por 11.06.2014 / 01:54
1

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

    
por 11.06.2014 / 02:02
1

Se você não pode executar chsh porque você não tem privilégios de administrador, converse com alguém que tenha .

O mais provável é que você não possa usar chsh como não-raiz porque o sistema que está usando está configurado para que chsh não funcione, por exemplo, porque o sistema usa NIS ou LDAP em vez de apenas /etc/passwd file. Ou talvez o administrador do seu sistema apenas queira manter algum controle.

O procedimento para alterar seu shell depende das políticas de sua organização. Pode haver um comando local que faz o que o chsh normalmente faz. Ou você pode precisar enviar um ticket de suporte solicitando uma mudança de shell.

A maioria das outras respostas é boa, mas se seus administradores forem razoavelmente responsivos, talvez você não queira se incomodar em hackear seus scripts de inicialização. Provavelmente invoco zsh -l manualmente depois de fazer login até que o administrador atualize minha conta.

Outra coisa a ter em mente: Às vezes, diferentes shells podem usar os mesmos arquivos de inicialização. Por exemplo, sh e bash podem executar $HOME/.profile e csh e tcsh podem executar $HOME/.login e $HOME/.cshrc (embora arquivos de inicialização específicos do shell como .bashrc , .bash_profile e .tcshrc pode substituir esses). Se seu shell padrão for /bin/csh e você desejar usar /bin/tcsh , a atualização do .login para invocar /bin/tcsh -l poderá criar um loop infinito. zsh não executa arquivos de inicialização específicos de bash , então isso não é um problema para você.

A maioria das shells definem variáveis que identificam qual shell você está executando ( $BASH_VERSION , $tcsh , $ZSH_VERSION ). Se você for escrever código de inicialização para invocar seu shell preferido, não é uma má idéia incluí-lo em if , então ele é 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 "${ZSH_VERSION:-unset}" em vez de apenas "$ZSH_VERSION" permite a possibilidade de você ter feito set -o unset , uma opção que faz com que uma referência a uma variável indefinida seja um erro.)

    
por 11.06.2014 / 18:10
1

Eu posso pensar em alguns cenários.

  1. zsh não está em /etc/shells e o OP deseja usá-lo sem precisar digitar zsh no prompt de comando. Soluções possíveis.

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

    b) implore ao administrador para adicionar zsh a /etc/shells para que você possa chsh

    c) implore ao admin para mudar seu shell. isso não é sensato, porque você perderá a capacidade de ftp in. você só poderá usar ftp se tiver um shell em /etc/shells

  2. o usuário deseja escapar de um shell restrito, provavelmente rbash ou rsh .

    Se .profile for editável, o PATH poderá ser expandido editando-o. Quando /bin estiver no caminho, você poderá iniciar bash de dentro de rsh/rbash , obtendo acesso ao comando chsh para permitir a troca de shells. Muitos comandos têm escapes de shell que podem ser usados para escapar de um shell restrito e recuperar o acesso a chsh .

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

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

    
por 11.09.2017 / 17:05
-3

Eu não acho que a resposta fornecida realmente torna zsh o shell padrão. É simples alterar o shell para zsh assim que o usuário fizer login em seu shell padrão . O usuário ainda fará login no seu DEFAULT SHELL , mas com isso, o shell será alterado para zsh

Para alterar o uso padrão do shell:

usermod -s /path/to/shell username 

Você deve estar determinado a fazer isso.

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

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

    
por 10.06.2014 / 16:35