interrupção do som do sino do terminal

1
loc="locationA"
usr="user1"
fw_loc=$(</home/user/Desktop/FW_RULES.txt)

ssh -A -tt [email protected] <<ABC
fw_orig="$fw_loc"
fw_cmpr=\$(ssh root@$loc -o LogLevel=ERROR uci show firewall)
wc --lines <<<"\$fw_orig"
wc --lines <<<"\$fw_cmpr"
diff -s <(echo "\$fw_orig") <(echo "\$fw_cmpr")
exit
ABC

Eu tenho um script onde carrego o arquivo de texto local para variável no documento AQUI. Arquivo de texto tem aprox. 370 linhas. Então eu tomo regras de firewall de outro servidor e tento comparar se as regras do FW coincidem. No entanto, depois que a linha fw_orig="$ fw_loc" shell expande automaticamente a variável (embora não seja realmente necessária) e o terminal faz o som do bipe e faz interrupções no texto, assim:

[user2@jump ~]$ fw_orig="firewall.defaults=defaults
>firewall.poplanhttp3=rule
l
> firewall.poplanhttp3.name='poplanhttp3'
> firewall.lanpopchhttp2.name='lanpopahttp5'
> firewal
> firewall.lanpopchhttp2.dest='POPA'
.
firewall.poplanssh2.dest_port='27'
i
> firewall.poplanssh2.target='ACCEPT'
/

o texto é interrompido em linhas diferentes toda vez que eu o executo. Por que essas interrupções com som acontecem e como posso evitá-lo? Interessante é que, no final do meu script, eu comparo as duas variáveis, e o número de combinações de linhas, mas o comando diff encontra diferenças entre as variáveis em todas as interrupções de "$ fw_orig".

EDITAR quando tentei escrever variável para arquivo e depois compará-lo:

echo "\$fw_orig">/home/user2/file
..
..
diff -s <(echo "\$fw_orig") /home/user2/file
O comando

dif retornou:

Files /dev/fd/63 and /home/user2/file are identical

talvez possa ajudar a entender o que está acontecendo. no entanto, arquivo < > trabalhos de comparação de variáveis, variável < > comparação de variáveis não funciona ..

    
por mauek unak 19.10.2017 / 09:33

1 resposta

0

Vamos simplificar o exemplo, concentrando-nos apenas na linha defeituosa e em alguns de seus pré-requisitos e eliminando as etapas desnecessárias (como o ssh).

A variável fw_loc contém o conteúdo de um arquivo. Com certeza, tem muitas linhas novas e muitos espaços; presumivelmente outros caracteres especiais também.

Considerando que não vejo o conteúdo desse arquivo, tento ser malvado. Então aqui está a versão simplificada do que você está fazendo, com algum conteúdo imaginário do arquivo:

fw_loc='foo"; rm -rf "/ouch'

cat <<ABC
fw_orig="$fw_loc"
ABC

Se você executar isso, verá que isso é impresso

fw_orig="foo"; rm -rf "/ouch"

Em seu caso específico, ele não é cat ed, mas enviado para o host remoto para ser executado.

O nível de escape claramente não é suficiente. Eu acredito que esta é a razão para o comportamento estranho que você está experimentando, embora eu não tenha certeza de quais caracteres especiais ele falha no seu caso.

Uma abordagem possível é escapar do valor para que uma subseqüente associação no bash (no lado remoto) funcione corretamente usando printf %q :

fw_loc='foo"; rm -rf "/ouch'

cat <<ABC
fw_orig=$(printf %q "$fw_loc")
ABC

Tome cuidado ao usar aspas duplas imediatamente ao redor da referência de variável $fw_loc (caso contrário, printf não faz seu trabalho corretamente), mas não em torno da substituição do comando $(...) (porque printf %q depende de sua saída não estando entre aspas)!

Isto imprime

fw_orig=foo\"\;\ rm\ -rf\ \"/ouch

que é equivalente à definição de fw_loc acima.

Você pode precisar aplicar esse truque mais algumas vezes no seu script, não olhei mais de perto.

Uma solução alternativa pode ser dividir essa lógica complexa em etapas menores, por exemplo, transfira o arquivo usando scp , talvez até para localhost e faça a comparação localmente.

    
por egmont 19.10.2017 / 23:19