Sessões ssh não interativas não possuem PATH configurado em alguns sistemas

3

Eu configurei meu ambiente em .profile . Meu .profile é idempotente e .bash_profile , .bashrc , .kshrc e .zshrc all source .profile . Dessa forma, eu sempre obtenho o mesmo ambiente, independentemente do shell compatível com o bourne que eu uso, e independentemente de o shell ser interativo ou um shell de login.

Isso também funciona com o uso não interativo de ssh(1) , embora eu não saiba exatamente por quê.

iridium:aram$ ssh sunos.mgk.ro 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/sunos:/home/aram/bin/sunos/amd64:/home/aram/bin/sunos/386:/home/aram/go/bin:/opt/local/bin:/opt/local/sbin:/usr/gnu/bin:/usr/bin:/sbin:/usr/sbin:/usr/sfw/bin:/usr/local/bin:/usr/local/sbin:/home/aram/plan9/bin
iridium:aram$ ssh iridium 'env|grep ^PATH'
PATH=.:/Users/aram/bin:/Users/aram/bin/darwin:/Users/aram/bin/darwin/amd64:/Users/aram/bin/darwin/386:/Users/aram/go/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/pkg/bin:/usr/pkg/sbin:/usr/local/plan9/bin
iridium:aram$ ssh crimson 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/linux:/home/aram/bin/linux/amd64:/home/aram/bin/linux/386:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/bin:/usr/local/sbin

Em uma minoria de sistemas, isso não funciona, no entanto.

iridium:aram$ ssh ci20 'env|grep ^PATH'
PATH=/usr/bin:/bin

Eu tenho tentado fazer isso funcionar, mas sem sucesso. Eu tentei:

  • muda para outro shell em vez de bash
  • desabilitar o PAM em sshd_config
  • com o PAM ativado, defina BASH_ENV em / etc / environment

Estes não tiveram efeito, parece que o / etc / environment não é lido, independentemente da configuração do PAM.

Por favor, não sugira que eu force o bash para ser interativo na minha chamada ssh, ou que eu deveria manualmente criar o ambiente na minha chamada ssh, estou tentando corrigir o problema subjacente aqui.

Ao tentar depurar esses problemas, aprendi algumas coisas sobre o bash. Parece que o bash sempre fornecerá o bashrc, mesmo se for um shell não interativo, se a entrada padrão for um soquete. Algumas versões do OpenSSH iniciam bash dessa forma, mas em outras versões a entrada padrão é um pipe. Também há código no bash que tenta detectar se ele foi iniciado em uma sessão ssh e, nesse caso, ele também fornecerá o bashrc independentemente do status interativo, mas em alguns casos esse código é desabilitado em tempo de compilação. Esses fatos parecem relacionados ao meu problema, mas não está claro como posso resolver meu problema.

    
por Aram Hăvărneanu 19.03.2015 / 17:06

1 resposta

3

Eu entendi completamente qual é o problema.

O sshd deve realmente criar uma sessão de login não interativa, em vez de uma sessão de não login não interativa, mas isso não acontece. Bash se esforça muito para detectar o uso do ssh, e fontes se bashrc se ele acha que é iniciado pelo sshd, independentemente de ser interativo ou de login. Apenas o bash faz isso. Como tenho usado o bash, tenho confiado nesse comportamento de fornecimento, mesmo que não tenha funcionado com outros shells.

Existem duas maneiras de detectar o ssh. Parece se stdin é um socket (1), e se isso falhar, ele procura por algumas variáveis SSH_ (2). Não que recentemente, openssh mudou a maneira como funciona, então (1) nunca funcionará novamente porque stdin é agora um pipe, não um socket. (2) está habilitado em algumas distribuições Linux, mas desabilitado em outras. Eu tenho usado distros onde foi ativado.

Como o que o bash fez foi horrível, e como isso não funciona de maneira confiável, agora estou configurando BASH_ENV em ~ / .ssh / environment, de modo que agora sempre funciona, mas infelizmente agora preciso definir PermitUserEnvironment yes em sshd_config ...

Também não está claro por que não posso configurá-lo em /etc/environment , então funciona para todos os usuários.

    
por 19.03.2015 / 18:35