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 pwd
interativo 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
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Respostas:
BASH_ENV
será 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_login
e~/.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.
BASH_ENV
variável exportada será passada. Lembre-se de que isso pode estar oculto em um arquivo de origem.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 bash
para a lista exaustiva.PAM : Como sugerido nos comentários, verifique
/etc/security/pam_env.conf
e quaisquer arquivos adicionais mencionados porpam_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 sePermitUserEnvironment
estiver ativadosshd_config
)~/.ssh/rc
(depois de mudar para o diretório inicial; sempre)/etc/ssh/sshrc
(se~/.ssh/rc
não estiver presente)Nota:
sshd
também procuraráenvironment=value
linhas no arquivo de chaves autorizadas do usuário (sePermitUserEnvironment
estiver ativado), mas não está claro na página de manual em que essa etapa se enquadra na sequência acima.fonte
PermitUserEnvironment yes
está 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.sshd
. Isso também significa que pode haver um arquivo no servidor em funcionamento (verifique a lista dos que eu lhe deisshd
) que está configurando o ambiente.