O comando 'host' Can 'ssh' pode ser configurado para sempre carregar os arquivos de inicialização do lado do servidor?

5

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

    
por Dylan Cali 25.03.2015 / 19:50

2 respostas

2

Crie uma função shell do invólucro sshc , que prefixará a placa de texto source ~/.bash_profile para você:

function sshc {
    local host=$1
    local cmd=$2

    ssh $host "source ~/.bash_profile && $cmd"
}

Você pode usar isso como:

$ sshc localhost 'which perl'
/home/calid/perl5/perlbrew/perls/perl-5.20.1/bin/perl
    
por 25.03.2015 / 20:38
0

bash~/.bashrc mesmo quando não é interativo quando invocado por ssh (um IMO de má funcionalidade, mas seria útil para você aqui).

Você pode adicionar ao topo de ~/.bashrc no host remoto:

if [ -n "$SSH_CLIENT" ] &&
   [ "$SHLVL" = 0 ] &&
   [ -n "${-##*[il]*}" ]; then
   . /etc/profile
   . ~/.bash_profile
fi
    
por 30.03.2015 / 00:28

Tags