Por que o 'ssh host echo $ PATH' e a impressão do $ PATH após o ssh'ing na máquina geram resultados diferentes?

6

Em um host específico, quando eu ssh na máquina e digito echo $PATH , obtenho

/home/wxy/bin64:/home/wxy/bin:/usr/kerberos/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin

e se eu executar ssh host 'echo $PATH' eu vejo isso:

/usr/local/bin:/bin:/usr/bin

Por que essa discrepância?

Além disso, o que posso fazer se eu quiser ver o resultado anterior usando o último comando?

    
por Programming Noob 17.06.2013 / 20:15

3 respostas

11

No primeiro cenário você está logando no sistema, então você está executando o que é chamado de tipo de conexão login . Um login origina os scripts em $HOME/.bashrc e $HOME/.bash_profile se o seu login shell for Bash. Esses dois scripts normalmente originam os arquivos /etc/bashrc e os arquivos em /etc/profile.d/*.sh .

Para o segundo cenário, você está apenas obtendo o arquivo $HOME/.bashrc . Este tipo de login é chamado interativo .

Você pode ler mais sobre isso na seção INVOCATION da página do bash man .

Para alterar esse comportamento, você pode incluir o $ HOME / .bashrc_profile como parte da execução interativa para obter o comportamento desejado:

$ ssh user@remotehost '. $HOME/.bash_profile; echo $PATH'

-ou-

$ ssh user@remotehost 'source $HOME/.bash_profile; echo $PATH'

Referências

por 17.06.2013 / 20:28
2

Os arquivos de inicialização de sessão são estranhos, por razões históricas histéricas .

Há muito tempo, você fez login no console, ponto final. Quando você logou, você tem um shell, e o shell carregaria algum arquivo de inicialização. Para shells no estilo Bourne, há dois arquivos de inicialização: /etc/profile (para todos os usuários) e ~/.profile (para cada usuário). O arquivo de inicialização pode definir variáveis de ambiente como PATH , carregar aplicativos que você deseja executar em cada sessão (por exemplo, um indicador de email), etc. Se um shell não for um login shell , não é necessário iniciar nada nem definir variáveis de ambiente, portanto, não há necessidade de executar qualquer arquivo de inicialização. Certamente não há…

Na verdade, os shells gradualmente ganharam recursos interativos, portanto, há necessidade de um arquivo de inicialização para shells interativos. Ksh tem ~/.kshrc , bash tem ~/.bashrc , zsh tem ~/.zshrc .

Logins interativos remotos executam /etc/profile e ~/.profile . Mas eles não são adequados para logins não interativos porque podem iniciar programas não interativos. Infelizmente, nenhum padrão surgiu para um arquivo de inicialização para logins não interativos.

Você pode executar /etc/profile e ~/.profile manualmente se tiver certeza de que eles não produzirão nenhuma saída ou iniciarão qualquer programa, basta definir variáveis de ambiente.

ssh foo '. /etc/profile; . ~/.profile; somecommand'

Se você tem partes no seu .profile que só fazem sentido em uma sessão interativa, você pode colocá-las dentro de uma instrução condicional.

## (in ~/.profile)
case $- in
  *i*) # the shell is interactive
    newmail;;
esac

Se o seu shell de login é bash, você pode tirar proveito de uma peculiaridade: o arquivo de inicialização ~/.bashrc é lido por shells interativos e também por shells não interativos cujo processo pai é chamado rshd ou sshd . Outras conchas não têm essa peculiaridade.

## (in ~/.bashrc)
case $- in
  *i*) # interactive shell: set prompt, completion settings, key bindings, etc.
    …;;
  *) # non-interactive shell: our parent must be rshd or sshd
    . ~/.profile;;
esac
    
por 18.06.2013 / 02:11
0

se você estiver usando bash, verifique /etc/profile no host que você não consegue obter a saída esperada. Observe que o bash primeiro lê e executa comandos do arquivo /etc/profile , se esse arquivo existir. Depois de ler esse arquivo, ele procura ~/.bash_profile , ~/.bash_login e ~/.profile , nessa ordem, e lê e executa comandos do primeiro que existe e é legível.

    
por 17.06.2013 / 20:40