Onde é geralmente definido o $ BASH_ENV?

19

Eu tenho servidores Linux gêmeos que devem ser configurados de forma idêntica, no entanto, os comandos ssh para um deles estão falhando para comandos que exigem um caminho especificado em ~ / .bashrc. Por exemplo, eu posso usar um comando como pwdinterativo e através do ssh, mas se eu tentar executar um programa localizado em uma pasta bin do aplicativo, ele funcionará apenas em um shell interativo para um dos servidores.

O arquivo / etc / profile e / etc / environment nos dois servidores são idênticos; no entanto, $ BASH_ENV está definido como ~ / .bashrc no servidor que está funcionando corretamente. Quero definir $ BASH_ENV no servidor que não está funcionando, mas prefiro configurá-lo no mesmo local em que está definido no servidor em funcionamento. Quais são os locais que o Linux executará no momento de um logon não interativo, como um comando ssh de outro computador?

edit: A linha em / etc / passwd para o usuário especifica / bin / bash nos dois servidores. O arquivo ~ / .bash_profile para os dois servidores é idêntico e contém if [ -f ~/.bashrc ]; then . ~/.bashrc; fi. A única diferença entre os sistemas é que $ BASH_ENV é uma sequência nula no servidor que não está funcionando, e não consigo encontrar onde foi definido no servidor que está funcionando.

edit 2: O arquivo ~ / .ssh / environment nos dois servidores possui BASH_ENV = ~ / .bashrc

Manjericão
fonte
1
/ Etc / passwd é idêntico nos dois servidores? Se o bash for chamado como "/ bin / sh" em vez de "/ bin / bash", ele não lerá nenhum arquivo bashrc (apenas arquivos de perfil).
freiheit
Não é idêntico, mas o usuário que estou enviando comandos tem a mesma linha em / etc / passwd nos dois sistemas.
Basil
E quanto a ~ / .profile e ~ / .bash_profile?
freiheit
eles são idênticos e ambos contêmif [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Basil
Você verificou que / etc / bashrc e /etc/profile.d/* são idênticos? ~ / .bash_login? /etc/pam.d/*? /etc/security/pam_env.conf?
freiheit

Respostas:

21

BASH_ENVserá definido apenas por meio do ambiente ou de outro script originado durante a inicialização. Para um shell não interativo, ele só tentará obter arquivos adicionais se esse shell também for um shell de logon. (nesse caso, ele lerá ~/.bash_profile, ~/.bash_logine ~/.profile... mas se estivesse fazendo isso, você não estaria enfrentando um problema)

O primeiro lugar para procurar é o ambiente em que o subshell está sendo chamado.

  • Uma BASH_ENVvariável exportada será passada. Lembre-se de que isso pode estar oculto em um arquivo de origem.
  • Pode ser alimentado como um parâmetro na mesma linha que chama o script, ie BASH_ENV=blah /path/to/somecommand.sh. Isso se destaca como um polegar dolorido, então você provavelmente teria percebido.

Se estiver sendo definido após o login, mas não for possível descobrir onde, talvez seja necessário examinar o responsável pela construção do ambiente de login.

  • Todos os arquivos usuais que são obtidos por um shell de logon. man bashpara a lista exaustiva.

  • PAM : Como sugerido nos comentários, verifique /etc/security/pam_env.confe quaisquer arquivos adicionais mencionados por pam_env.so. Outros módulos PAM também podem ser responsáveis, mas se suas configurações de PAM parecerem idênticas, provavelmente não é esse o caso.

  • sshd : Ele examinará os seguintes arquivos, em ordem:

    • ~/.ssh/environment(antes de mudar para o diretório inicial; somente se PermitUserEnvironmentestiver ativado sshd_config)
    • ~/.ssh/rc (depois de mudar para o diretório inicial; sempre)
    • /etc/ssh/sshrc(se ~/.ssh/rcnão estiver presente)

Nota: sshdtambém procurará environment=valuelinhas no arquivo de chaves autorizadas do usuário (se PermitUserEnvironmentestiver ativado), mas não está claro na página de manual em que essa etapa se enquadra na sequência acima.

Andrew B
fonte
Eu encontrei a diferença! PermitUserEnvironment yesestá definido em / etc / ssh / sshd_config no servidor de trabalho, mas não no problema. Eu mudei, mas acabei de testar um comando e ele não funcionou novamente. Esse arquivo é analisado toda vez que tento fazer o ssh? Eu não tenho um ~ / .ssh / rc para o usuário em que estou trabalhando e não há arquivo / etc / ssh / sshrc nos dois sistemas.
Basil
Ah, acho que preciso reinicializar o ssh? /etc/init.d/sshd?
Basil
@ Basil Sim, você precisa reiniciar sshd. Isso também significa que pode haver um arquivo no servidor em funcionamento (verifique a lista dos que eu lhe dei sshd) que está configurando o ambiente.
Andrew B
Sim, essa foi a parte frustrante - tudo o que eu preciso está definido no .bashrc, que simplesmente não estava sendo executado :) Muito obrigado pela sua ajuda - estou agendando uma alteração para reinicializar o SSH e vou relatar. Presumo que funcione.
Basil
Acabei de reinicializar o SSH e agora meus comandos não interativos estão funcionando! Muito obrigado por sua ajuda, eu nunca teria encontrado esse campo sozinho.
Basil