Onde está minha entrada colada?

1

Eu estou copiando e colando sequências de comandos shell no meu emulador de terminal, e estou confuso com o comportamento.

  • Quando colo a linha única ssh user@remote "echo foo"; echo baz , o computador faz o que eu esperava. Ele executa o comando SSH e ecoa algo depois que eu terminar minha sessão SSH.
  • No entanto, quando colo a mesma coisa que um comando de várias linhas, isso não acontece.
    ssh user@remote "echo foo"
    echo baz
    Eu ainda recebo a sessão SSH, mas o echo baz desaparece completamente. Nenhum comando é executado.
  • Isso parece ter algo a ver com o SSH, pelo menos. Porque a substituição do SSH por algo mais produz o comportamento que eu estava realmente esperando. Os dois comandos são executados quando eu colo isso, por exemplo:
    echo foo
    echo baz

Então, o que está acontecendo? Onde está a entrada colada? Por que o comando echo não é executado por qualquer coisa ? Como isso está relacionado ao SSH?

(A propósito: eu sei do método Ctrl + X , Ctrl + E , mas às vezes , especialmente ao usar emuladores de terminal no Windows, isso não funcionará imediatamente.)

    
por mjktfw 25.06.2018 / 16:23

1 resposta

1

Tente colar isto:

ssh user@host 'read foo; echo ">>$foo<<"'
echo bar

Você verá >>echo bar<< como saída do echo no servidor.

Isso significa que ssh irá alimentar os dados colados em sua entrada padrão, como se você tivesse feito

echo 'echo bar' | ssh user@host 'read foo; echo ">>$foo<<"'

A solução para isso, além de nunca colar comandos shell no terminal para executá-los, é usar ssh -n , que redirecionará /dev/null para ssh :

ssh -n user@host 'echo foo'
echo bar
Infelizmente eu não sei a mecânica da colagem, então eu não posso dizer nada inteligente sobre por que os dados colados acabam no fluxo de entrada padrão de ssh , mas eu sou supondo que tem a ver com o fluxo sendo herdado do shell interativo (que lê os comandos da entrada padrão).

Usar ssh -n também é a solução (ou pelo menos a solução) para a questão

while read something; do
    ssh user@host 'somecommand'
done <inputfile

Aqui, o loop só será executado uma vez, pois ssh come os dados de inputfile .

    
por 25.06.2018 / 21:24

Tags