'ssh host' é um shell de login, mas 'ssh host command' não é?

10

Percebi que quando executo um comando diretamente em um host SSH usando a sintaxe ssh <host> <command> , vejo a saída de .bashrc , mas não a saída de .bash_profile (ou .profile ).

Por exemplo, se eu colocar o seguinte comando no topo de ambos os arquivos,

echo ${BASH_SOURCE[0]}

e manualmente fonte .bash_profile (que fontes .bashrc por sua vez), vou ver

$ . .bash_profile
.bash_profile
.bashrc

Esta é a mesma saída que vejo se eu fizer login neste computador remotamente via SSH, usando a forma ssh <host> do comando. (E se eu guardar .bash_profile em outro lugar temporariamente, nenhuma dessas linhas será ecoada.)

No entanto, se eu executar um comando diretamente na máquina remota com a forma ssh <host> <command> de ssh , a saída será assim:

$ ssh <host> echo foo
/home/rlue/.bashrc
foo

Meu entendimento é que a diferença entre .bash_profile e .bashrc é que o primeiro é para shells de login enquanto o segundo é para shells interativos e não-login .

Eu concluí o seguinte:

  1. ssh <host> sources only .bash_profile , enquanto
  2. ssh <host> <command> sources only .bashrc , o que significa
  3. o primeiro é um shell de login e o segundo não.

Estas conclusões estão corretas? Por que ssh <host> <command> é tratado como um shell interativo de não-login? O SSH ainda está logando na máquina remota para executar o comando?

    
por Ryan Lue 02.07.2017 / 11:18

3 respostas

11

O OpenSSH (provavelmente o que você está executando) decide se deve ou não criar um shell de login, e isso só acontece se você não estiver executando um comando específico. De man ssh :

 If command is specified, it is executed on the remote host instead of a
 login shell.

Portanto, é uma escolha de implementação para o servidor ssh se ele deseja criar um shell de login ou não, e se você der um comando para executar, ele não o fará.

Enquanto ssh realiza um login, se você está tendo que executar um comando e sair, é muito mais semelhante a criar um shell apenas para executar esse comando do que para obter um ambiente de login. Parece que, dado que as pessoas que escrevem o OpenSSH decidiram tratá-lo como esse tipo de tarefa.

Eles criam um shell não-interativo, sem logon, para executar o comando, porque esse é o espírito de executar um comando em outro contexto / shell. Normalmente, no entanto, os shells não interativos não criam automaticamente ~/.bashrc , o que está claramente acontecendo aqui. O bash está realmente tentando nos ajudar aqui. De os documentos

Invoked by remote shell daemon

Bash attempts to determine when it is being run with its standard input connected to a network connection, as when executed by the remote shell daemon, usually rshd, or the secure shell daemon sshd. If Bash determines it is being run in this fashion, it reads and executes commands from ~/.bashrc, if that file exists and is readable. It will not do this if invoked as sh. The --norc option may be used to inhibit this behavior, and the --rcfile option may be used to force another file to be read, but neither rshd nor sshd generally invoke the shell with those options or allow them to be specified.

    
por 02.07.2017 / 13:07
1

Primeiro você precisa ver os diferentes tipos, você pode ler isto:

link

Agora, se você abrir o seu bashrc, você verá no começo:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Isso significa que, dependendo de como você está acessando o sistema, esse arquivo carrega o código ou não.

    
por 02.07.2017 / 11:36