problema com aspas de trás dentro do laço ao executar um comando sobre o ssh

0

Esta questão é um pouco complicada. Vou tentar explicar em detalhes.

Eu tenho duas máquinas, uma é local e outras dizem 192.168.1.2 . Eu defini as seguintes variáveis na minha máquina local

CHECK="/home/test/Desktop/"

Existe um usuário chamado test tanto na máquina local quanto na máquina remota. Eu quero executar o seguinte comando do meu local sobre ssh.

ssh -n [email protected] "until [ 'cat $CHECK/samplefile | grep "string"' ]; do touch  $CHECK/success; done"

O que eu estou tentando alcançar é, eu quero verificar o $ CHECK / samplefile para a entrada chamada "string" na minha máquina remota. Uma vez encontrado, quero sair do loop until e ir mais longe. Mas quando eu executo este comando, recebo a seguinte mensagem de erro.

cat: /home/test/Desktop//samplefile: No such file or directory

Mas tenho certeza de que minha máquina remota contém samplefile de nome de arquivo na área de trabalho do usuário de test . Em uma pesquisa posterior, vim a saber que a declaração condicional de until fornecida em backquotes é executada em local em vez de remote (Meu local não contém esse arquivo no Desktop). Além disso, o restante dos comandos dentro do loop funciona bem e um novo arquivo chamado success é criado no Desktop da máquina remota.

Não tenho certeza se o problema é com backquotes ou até. Eu tenho sido preso nisso pelas últimas 3 horas. Alguma sugestão?

    
por Anonymous Platypus 16.03.2017 / 16:04

3 respostas

3

Como você percebeu em sua pergunta, esta substituição:

'cat $CHECK/samplefile | grep "string"'

foi executado na sua máquina local. Você pode corrigir isso facilmente:

ssh -n [email protected] \
"until { cat ""$CHECK""/samplefile | grep ""string""; }; do \
touch  ""$CHECK""/success; \
done"

Como você pode ver, você não precisa de nenhuma substituição, mas para resolver a variável $CHECK . Você pode colocar as instruções condicionais em uma lista {...} e agora o código de saída da lista é decisivo para a instrução until .

    
por 16.03.2017 / 16:24
2

Você está certo de que é a citação. Usando aspas duplas para envolver seu comando remoto, você está dizendo ao seu shell local para interpretar o que puder para passar para a sessão ssh. Nesse caso, o comando cat .

Se você colocar seu comando entre aspas simples, não terá esse problema, mas também não poderá expandir as variáveis que foram definidas fora das aspas simples.

arquivo local:

bash-[501]$ echo $(hostname) > /tmp/samplefile
bash-[506]$ echo $(cat /tmp/samplefile)
tank

crie o arquivo remoto:

bash-[502]$ ssh evil 'echo $(hostname) > /tmp/samplefile'
bash-[501]$ cat /tmp/samplefile
evil

tente visualizar o arquivo remoto com aspas duplas:

bash-[508]$ ssh evil "echo 'cat /tmp/samplefile'"
tank

tente visualizar o arquivo remoto com aspas simples:

bash-[509]$ ssh evil 'echo 'cat /tmp/samplefile''
evil

defina o arquivo como uma variável a ser processada no lado remoto:

bash-[527]$ ssh evil 'F=/tmp/samplefile; cat $F'
evil

No seu caso, colocando o comando entre aspas simples e definindo $CHECK dentro dessas citações, será suficiente para enviar tudo para ser interpretado no lado remoto.

ssh -n [email protected] 'CHECK=/home/test/Desktop; until [ 'cat $CHECK/samplefile | grep "string"' ]; do touch  $CHECK/success; done'
    
por 16.03.2017 / 16:51
0
export CHECK='/home/test/Desktop'
ssh -n [email protected] 'until [ 'cat "$CHECK/samplefile" | grep "string"' ]; do touch  "$CHECK/success"; done'
    
por 16.03.2017 / 16:09