Eu gostaria de executar comandos ssh remotos e fazer com que eles sempre carreguem arquivos de inicialização do lado do servidor por padrão. Estou procurando uma solução que não exija:
- configuração por raiz
- adicionando placa de caldeira extra ao comando a cada vez
- duplicando variáveis de ambiente em vários arquivos
Estou não procurando transportar variáveis de ambiente local para o shell remoto. Eu quero executar um comando remoto usando a sintaxe baunilha ssh <host> <command>
e executá-lo usando o mesmo ambiente que uma sessão de login remoto obteria.
Antecedentes
O abaixo assume que bash
está sendo usado para simplificar
Por padrão, os comandos ssh remotos iniciam um shell não interativo e não-login. Citando a página man:
If command is specified, it is executed on the remote host instead of
a login shell.
Você pode ver isso mais explicitamente no shell executando:
# the lack of 'i' indicates non-interactive
$ ssh localhost 'echo $-'
hBc
$ ssh localhost 'shopt login_shell'
login_shell off
Mas e se o seu comando remoto precisar de determinadas variáveis de ambiente definidas? Sendo um shell não interativo, não interativo, nenhum .bash_profile
nor .bashrc
será originado.
Isso é problemático, por exemplo, se você estiver usando ferramentas como perlbrew ou virtualenv e deseja usar seu interpretador personalizado no comando remoto:
$ which perl
/home/calid/perl5/perlbrew/perls/perl-5.20.1/bin/perl
$ ssh localhost 'which perl'
/usr/bin/perl
Soluções que não satisfazem os requisitos acima
Invoca explicitamente um shell de login no comando remoto
$ ssh localhost 'bash --login -c "which perl"'
Requer placa de caldeira extra a cada vez
Fonte explícita do seu perfil antes do comando
$ ssh localhost 'source ~/.bash_profile && which perl'
Requer placa de caldeira extra a cada vez
Defina as variáveis de ambiente em ~/.ssh/environment
Requer raiz para ativar esta funcionalidade no servidor
Variáveis de ambiente duplicadas já definidas nos arquivos de inicialização do servidor
Defina ENV
e BASH_ENV
Não funciona: .bash_profile
e .bashrc
não são originados
Definir em ~/.ssh/environment
funciona, mas requer acesso root para ativar
Prefira o comando com as variáveis de ambiente que você precisa
Requer chapas extras de caldeira a cada vez (potencialmente muito)
Variáveis de ambiente duplicadas já definidas nos arquivos de inicialização do servidor
Postagens relacionadas
link
link
arquivo de ponto não originado ao executar um comando via ssh