Verificando se o software está instalado na sessão SSH

0

Estou tentando verificar se um determinado pacote está instalado na máquina remota no script bash.

Se eu executar a seguinte declaração na própria máquina, o resultado é 1 (instalado) no arquivo check.txt, que está correto:

dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed" > /home/someuser/check.txt

No entanto, se eu executar o mesmo comando na sessão SSH, o resultado será sempre 0.

Alguém pode explicar por que e como corrigir isso?

Obrigado.

#!/bin/bash
ADDRESS=SOMEUSER@$SOMESERVER

function run {
    ssh $ADDRESS /bin/bash $@
}

run << SSHCONNECTION

dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed" > /home/someuser/check.txt

SSHCONNECTION
    
por Alex 23.11.2016 / 01:47

1 resposta

3

Altere seu script: run << \SSHCONNECTION ou dpkg-query -W -f='\${Status}' nano . Atualmente, seu shell local está tentando expandir ${Status} (sim, embora esteja entre aspas simples) porque está em um documento aqui. (E é presumivelmente se expandindo para uma string nula.)

A primeira parte está razoavelmente bem documentada. A especificação POSIX Linguagem de Comandos Shell , Seção 2.7.4 Documento aqui diz:

The format is … [n]<<word
      ︙
If any part of word is quoted… the here-document lines shall not be expanded.
      ︙
If no part of word is quoted, all lines of the here-document shall be expanded …

bash (1) diz essencialmente a mesma coisa.

A segunda parte não é tão claramente documentada. A sentença acima da especificação POSIX continua:

If no part of word is quoted, all lines of the here-document shall be expanded for parameter expansion, command substitution, and arithmetic expansion.  In this case, the <backslash> in the input behaves as the <backslash> inside double-quotes (see Double-Quotes).

Essa seção também diz:

The here-document shall be treated as a single word that begins after the next <newline> and continues until there is a line containing only the delimiter and a <newline>, …

Por contraste, a Seção 2.3 Token Recognition diz:

When an io_here token (i.e., a << or <<-) has been recognized by the grammar (see Shell Grammar), one or more of the subsequent lines immediately following the next NEWLINE token form the body of one or more here-documents and shall be parsed according to the rules of Here-Document.

When it is not processing an io_here, the shell shall break its input into tokens by applying the first applicable rule below …

e, em seguida, lista dez regras, incluindo

  1. If the current character is <backslash>, single-quote, or double-quote and it is not quoted, it shall affect quoting for subsequent characters up to the end of the quoted text.

Então, acho que precisamos ler nas entrelinhas para ver texto aqui-documentos é tratado quase como se já estivesse entre aspas duplas, e é processado somente para expansão de parâmetros, substituição de comando e expansão aritmética (e processamento de backslash limitado), e não para remoção de cotações.

Além disso, você deve sempre citar suas referências de variáveis de shell (por exemplo, "$ADDRESS" e "$@" ) a menos que você tenha um bom motivo para não e você tem certeza de que sabe o que está fazendo.

    
por 23.11.2016 / 02:18