~ / .profile não é carregado ao usar SSH (Ubuntu)

22

Editado para refletir o problema que realmente queria resolver:

Preciso configurar meu ambiente ruby ​​para poder implantar via Capistrano.

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

Eu os coloquei em ~ deploy / .profile, mas quando ssh, eles não estão sendo executados. Ideias?

Estou executando o Ubuntu 12.04.


A pergunta original era:

Quando ssh em outra conta no localhost, ele não carrega meu .profile. Como forçar o ssh a carregá-lo? Estou executando o Ubuntu 12.04.

Charles R
fonte

Respostas:

15

Você pode especificar explicitamente que deseja iniciar um shell de logon interativo:

 ssh user@host bash --login -i 

O "papel" de ~/.profile(ou ~. / Bash_profile) e .bashrcdo ssh tem outros arquivos (veja man sshpara detalhes):

~ / .ssh / ambiente

Contém definições adicionais para variáveis ​​de ambiente; veja AMBIENTE, acima.

~ / .ssh / rc

Os comandos neste arquivo são executados pelo ssh quando o usuário efetua login, imediatamente antes do shell (ou comando) do usuário ser iniciado. Veja a página de manual do sshd (8) para mais informações.


fonte
“Você pode” geralmente não é verdadeiro, porque o ssh está sendo executado por outra ferramenta (entrega contínua) e o comando não pode ser facilmente alterado.
Jan Hudec 25/09
6

.profileé carregado apenas para shells de logon, o que não é uma sessão ssh (por padrão). Se você deseja que algo seja executado na inicialização de todos os shells interativos, insira-o .bashrc( .zshrcou o que seu shell usar).

Além disso, se você quiser apenas fazer login em outra conta na máquina local, o ssh provavelmente será um exagero. Você pode querer usar suou algo assim.

qmega
fonte
3
Parece que .bashrctambém não está carregado.
Kenorb #
Isto está incorreto. Ele é um shell de login. Na página do manual: "Se o comando for especificado, ele será executado no host remoto em vez de no shell de login".
Mkj 23/07
~ / .zshenv funciona para mim. unix.stackexchange.com/questions/4921/sh-startup-files-over-ssh
user91155
Quando o comando ssh recebe um comando para executar, o padrão é não alocar um tty e, em seguida, o shell também não é "interativo".
Jan Hudec 25/09
4

Usar o bash deve resultar em leitura ~/.bashrc. O seguinte pode ajudar com ksh e sh (bash no modo sh) ou quando você ~/.bashrcnão for executado durante o login.

O sshd consulta ~/.ssh/environment(verifique se há permissões no sshd_config (5)) e ~/.ssh/sshrcou ~/.ssh/rc. Isto dá a possibilidade de configurar ENV=~/.profileou BASH_ENV=~/.profileeSSH_LOGIN=Y

No ~/.profileeu tenho o seguinte layout (Substitua ENVpor BASH_ENVao usar o bash):


if [[ -n $SSH_LOGIN || -z $ENV ]]; then
     # Put here login initialization code
     unset SSH_LOGIN
     ENV=~/.profile
fi
 # Put here code thats get executed with each ksh/sh invocation

eremmel
fonte
0

O Bash lê ~/.profileapenas quando é um shell de login e ~/.bash.bashrcapenas se tiver um terminal, nenhum dos quais é verdadeiro por padrão ao chamar um comando com ssh. No entanto, existem várias outras opções para definir o ambiente, no servidor, todas infelizmente dependendo da configuração do sistema:

  • Zsh lê ~/.zshenvmesmo neste caso; embora não haja um arquivo de configuração correspondente para o bash.
  • Se a PermitUserEnvironmentopção estiver /etc/sshd_configativada, o ssh lerá ~/.ssh/environment. Infelizmente, esta opção é desativada.
  • Se o pam_env.sofor chamado com user_readenv=1in /etc/pam.d/sshd, ele lerá ~/.pam_environment. Embora não seja o padrão do módulo, é chamado assim pelo menos no Ubuntu .
  • Se tudo mais falhar, você pode colocar uma command=diretiva no arquivo de chaves autorizadas chamando um script de wrapper que define o ambiente e executa $SSH_ORIGINAL_COMMANDo final (se o comando é um para shell, então eval é apropriado aqui, mas não tenho certeza) .
Jan Hudec
fonte
0

Você provavelmente tem um ~/.bash_profile, que substitui ~/.profile.

Mehrdad
fonte