ssh usuário @ IP sh comando variáveis de ambiente perdidas

5

Eu uso uma abordagem

ssh user@IP sh [runme.sh]

para executar o script remotamente, isso funciona bem. Mas eu tenho um problema, que é em runme.sh, não consigo obter variáveis ambientais definidas em ~ / .bashrc. Se eu iniciar o script localmente, tudo correrá bem, mas como posso obter essas configurações de ambiente com o comando ssh?

Uma abordagem viável é adicionar uma linha

. ~/.bashrc

em todos os runme.sh no início, mas, dessa forma, preciso modificar muitos arquivos "runme.sh" nos clientes. Existe uma ideia melhor?

    
por Weiwei Yang 28.04.2011 / 06:36

5 respostas

6

Você não deve ter definições de variáveis de ambiente em ~/.bashrc , esse arquivo é para configurações de bash ao executar interativamente (aliases, prompts, esse tipo de coisa). O local para variáveis de ambiente é ~/.profile ; é lido quando você inicia uma sessão interativa no modo de texto e em muitos sistemas também no modo gráfico. Consulte esta resposta para obter mais detalhes.

Para executar um shell bash que define suas variáveis de ambiente normalmente para a máquina remota, você pode fazer

ssh user@IP bash --login runme.sh

Para outros shells, faça-os ler seu .profile (e talvez /etc/profile também):

ssh user@IP '. /etc/profile; . ~/.profile; exec runme.sh'

Se você deseja copiar variáveis de ambiente de sua sessão local sobre o ssh, isso é possível, mas geralmente desativado no lado do servidor. Leia esta resposta para mais detalhes.

    
por 28.04.2011 / 22:50
1

Que tal isso:

ssh user@IP -- '. ~/.bashrc; sh runme.sh'

Você provavelmente deve ser um pouco cuidadoso com a distinção entre sh e bash . Se você tiver personalizações sofisticadas em .bashrc e sh for algo como traço, isso poderá falhar.

    
por 28.04.2011 / 06:54
0

Que tal obter o comando /etc/profile on ssh ?

ssh user@host "source /etc/profile; sh runme.sh"

Adotado de uma resposta em esta questão

    
por 28.04.2011 / 09:10
0
# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Normalmente, ~/.bashrc começará com alguma forma do código anterior. Quando você executa um comando diretamente com o ssh, o bash não estará rodando de forma interativa, então você precisa ter certeza de que as variáveis de ambiente que você deseja configurar estão antes de qualquer linha.

    
por 28.04.2011 / 09:25
0

No sistema de destino, sh na verdade bash ? Muito bem pode não ser, o que é uma possível razão para o seu .bashrc não ser lido automaticamente.

A execução de bash runme.sh funciona? Se assim for, esse é o seu problema.

Além disso, como alguém já apontou, se você tem algo que detecta se o seu shell está executando interativamente no seu .bashrc , suas variáveis devem ser definidas acima deste código.

    
por 28.04.2011 / 17:29