como posso usar o bash como meu shell de login quando meu sysadmin se recusa a me permitir alterá-lo


38

O administrador de sistemas unix em que estou trabalhando reluta em me dar acesso para alterar meu shell de login de kshpara bash. Ele deu várias desculpas, a mais engraçada é que, uma vez que eles escrevem todos os seus scripts, ksheles não funcionarão se eu tentar executá-los. Não sei de onde ele tira essas idéias, mas como não posso convencê-lo, há alguma alternativa que eu tenha?

( chshestá instalado nessas máquinas, mas usamos pares de chaves públicos / privados para efetuar login, e eu não tenho senha, portanto, quando chshsolicita uma senha, não tenho nada para fornecê-la.)

Respostas:


69

Quando você faz login, o arquivo ~/.profileé lido pelo shell de login (ksh para você). Você pode instruir esse shell de login a se substituir pelo bash. Você deve tomar algumas precauções:

  • Substitua o shell de logon apenas se for interativo. Isso é importante: caso contrário, o login no modo gráfico pode não funcionar (isso depende do sistema: alguns, mas nem todos os sistemas leem ~/.profileao efetuar o login através do xdm ou similar), e expressões idiomáticas, como ssh foo '. ~/.profile; mycommand'falharão.
  • Verifique se o bash está disponível, para que você ainda possa efetuar login se o executável não estiver lá por algum motivo.

Você tem a opção de executar o bash como um shell de login ou não. A única grande diferença em torná-lo um shell de login é que ele carregará ~/.bash_profileou ~/.profile. Portanto, se você executar o bash como shell de login, tenha muito cuidado para ~/.bash_profilenão executar o bash recursivamente ~/.profile. Não há nenhuma vantagem real de ter sido ~/.profileexecutado pelo bash em vez do ksh, então eu recomendo não fazê-lo.

Defina também a SHELLvariável de ambiente como bash, para que programas como emuladores de terminal invoquem esse shell.

Aqui está o código para mudar para o bash. Coloque no final de ~/.profile.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac

17
Excelente resposta! O stackexchange precisa do botão Enviar uma cerveja : essa seria a hora em que eu o usaria.
Iconoclast

Obrigado primeiro e. .profilesó funciona para o shell de logon (conforme a necessidade do OP). Eu uso a Conexão de área de trabalho remota do Windows 10 para fazer login em uma estação de trabalho Linux e, em seguida, abra o Terminal no gnome. Eu quero zshenquanto meu administrador de sistemas me der bash. Nesse caso, tenho que adicionar o trecho em .bashrcvez de .profile.
Fim de semana

12

Isso é um pouco desagradável, mas você pode causar basho shell que está usando no login, criando um .profilearquivo em seu diretório pessoal, contendo

SHELL=`type -P bash`
exec bash -l

Isso fará com que a kshsessão seja substituída por uma bashsessão. Você não precisará digitar exit(ou ^D) duas vezes, como faria se tivesse iniciado manualmente uma nova bashsessão sempre que fizer login. E digitando

echo $SHELL

retornará o caminho para bash.


3
é claro que você pode alterar facilmente o $ SHELL adicionando uma linha para fazer isso antes do executivo.
derobert

2
Se você deseja que o novo shell também seja um shell de login, provavelmente deve exec bash -l.
Jw013

11
Um último comentário: typeé recomendado ao longo which.
Jw013

11
Eu não entendi! bashTambém não vai ler .profile, gerando um loop infinito? Concordo que algo do tipo exec bashé o que você deseja, mas você precisa fazer isso apenas no seu login ksh, para que algumas instruções if sejam necessárias!
Bananguin

11
@ user1129682 não se houver ~/.bash_profileou~/.bash_login
Ulrich Dangel

4

A resposta de Giles deve ter o sinalizador -l adicionado ao executar o bash, para que qualquer script de perfil de login seja originado no novo shell do bash. (Por exemplo, qualquer coisa em /etc/profile.d/ no RHEL). O script deve então ser:

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac

Você pode explicar por que diz para adicionar a -lopção? Eu uso isso há meses sem problemas.
cokedude 24/09

1

Uma resposta csh/tcshinspirada no top votado por @Gilles é

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif

0

Solaris:

usermod -s /bin/bash root

11
O usermod não requer direitos de administrador, e a pergunta é "... quando meu administrador se recusa ..."?
Blessed Geek
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.