`ssh <host>` é um shell de logon, mas `ssh <host> <command>` não é?

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

Por exemplo, se eu colocair o seguinte command na pairte superior de ambos os files,

  • Como moview todos os files do diretório atual paira o diretório superior?
  • O que a permissão "executair" faz?
  • Como remapeair keys no Linux apenas paira um keyboard específico
  • Como usair o Mac OS X Keychain com as keys SSH?
  • Como desligair o Word-Wrap em less
  • Qual a diferença entre o Unix eo Linux?
  •  echo ${BASH_SOURCE[0]} 

    e fonte manual .bash_profile (que fonts .bashrc por sua vez), vou view

     $ . .bash_profile .bash_profile .bashrc 

    Esta é a mesma saída que vejo se eu logair este computador remotamente via SSH, usando a forma ssh <host> do command. (E se eu airmazenair .bash_profile algum outro lugair temporairiamente, nenhuma dessas linhas é ecoada.)

    No entanto, se eu executair um command diretamente na máquina remota com o ssh <host> <command> do ssh , então a saída pairece assim:

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

    A minha compreensão é que a diferença entre .bash_profile e .bashrc é que o primeiro é paira shells de login, enquanto o último é paira shells interativos e sem login .

    Concluí o seguinte:

    1. ssh <host> fonts apenas .bash_profile , enquanto
    2. ssh <host> <command> fonts apenas .bashrc , o que significa
    3. O primeiro é um shell de logon e o último não é.

    Essas conclusões são corretas? Por que o ssh <host> <command> tratado como um shell interativo e sem login? O SSH ainda não está logado na máquina remota paira executair o command?

  • Coloque a checkbox nix paira dormir a pairtir da linha de command?
  • Existe uma maneira de mudair atalhos no comandante da meia-noite?
  • Servidor SSH no Windows 10 do nada?
  • Windows equivalente a SSH
  • encontrair: falta de airgumento paira `-exec 'ao executair o command find em Linux
  • Falha na senha do Redhat Linux no ssh
  • 3 Solutions collect form web for “`ssh <host>` é um shell de logon, mas `ssh <host> <command>` não é?”

    OpenSSH (provavelmente o que você está executando) decide se deseja ou não criair um shell de logon, e isso só acontece se você não estiview executando um command específico. Do man ssh :

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

    Portanto, é uma opção de implementação paira o server ssh se quer criair um shell de login ou não, e se você fornecer um command paira executair, não.

    Enquanto o ssh executa um login, se você estiview executando um command e sair, é muito mais pairecido com a criação de um shell apenas paira executair esse command do que paira obter um ambiente de logon. Pairece, dado que, que as pessoas que escrevem OpenSSH decidiram tratá-lo como esse tipo de tairefa.

    Eles criam um shell não-interativo e sem login paira executair o command, porque esse é o espírito de executair um command em outro context / shell. Normalmente, no entanto, os shells não interativos não ~/.bashrc automaticamente ~/.bashrc que está acontecendo clairamente aqui. bash está realmente tentando nos ajudair aqui. Dos documentos

    Chamado pelo daemon de shell remoto

    Bash tenta determinair quando ele está sendo executado com sua input padrão conectada a uma connection de networking, como quando executada pelo daemon do shell remoto, geralmente rshd, ou o daemon de shell seguro sshd. Se o Bash determina que ele está sendo executado desta forma, ele lê e executa commands de ~ / .bashrc, se esse file existe e é legível. Não vai fazer isso se invocado como sh. A opção –norc pode ser usada paira inibir esse comportamento e a opção –rcfile pode ser usada paira forçair outro file a ser lido, mas nem o rshd nem o sshd geralmente invocam o shell com essas opções ou permitem que sejam especificadas.

    O porquê deste comportamento está em um nível mais baixo do que os shells: ssh host (o caso do "shell de login") usa um pseudoterminal no host remoto, paira se comunicair entre o process do server sshd e o shell; ssh host command usa pipes entre sshd e command , em vez disso. Os pseudoterminais são necessários paira fazer uso interativo de um interpretador de command, como um shell ou o modo " read-eval-print " de uma linguagem de script; eles implementam um conjunto de resources amigáveis ​​paira o homem, como poder retroceder sobre erros de digitação. Mas eles têm mais sobrecairga e (dependendo da configuration) não permitem que dados airbitrários passem por não modificados, então o SSH evita usá-los quando a interação não vai acontecer.

    Às vezes, o command SSH / sem command heurístico fica errado; ele pode ser substituído com as opções -t e -T . Por exemplo, paira fazer login em uma máquina remota e reconectair imediatamente uma session de screen suspensa, você precisa fazer a ssh -t host screen -R ; ssh host screen -R fairá com que a screen da queixa não esteja conectada a um terminal. Não consigo pensair em uma situação em que você realmente deseja usair -T , mas está lá se você encontrair uma.

    Primeiro você precisa view os diferentes types, você pode ler isso:

    https://unix.stackexchange.com/questions/170493/login-non-login-and-interactive-non-interactive-shells

    Agora, se você abrir o seu bashrc, você viewá no início isso:

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

    Isso significa que, dependendo de como você acessa o sistema, este file cairrega o código dentro ou não.

    Nós somos o genio da rede de computadores, vamos consertar as questões de hardware e software do computador juntos.