Por que a leitura com pipeline falha em uma sessão ssh?

1

Por que isso mostra linhas em branco em vez de pastas encontradas por find?

ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null \
  -o batchmode=yes -o passwordauthentication=no [email protected] \
  "sudo find /folder/CFGKCP/KCS\ Pro/Job\ Setup -name JOBCFG.info \
    | while read linea; do echo $linea; done";
    
por Guerraga 17.03.2016 / 12:59

4 respostas

3

Como Romeu apontou, você está usando aspas duplas em torno do seu comando. Isso significa que suas variáveis estão sendo expandidas antes de executar o comando ssh . Então o corpo do loop while é

echo $linea

e antes que o ssh linea provavelmente não exista, o comando que será passado se tornará apenas echo com linea sendo substituído por uma string vazia.

Se você usar aspas simples ao redor do parâmetro de comando, a expansão não acontecerá, e essa string será passada adiante, então

ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no [email protected] 'sudo find /folder/CFGKCP/KCS\ Pro/Job\ Setup -name JOBCFG.info | while read linea; do echo $linea; done'

ou escape do $ para dizer ao seu shell para não expandi-lo

    
por 17.03.2016 / 13:35
1

Porque você está usando aspas duplas. Isso significa que $linea é expandido antes que o ssh seja executado. Você pode testar isso com set -x :

$ set -x
$ ssh user@host "find /var  | while read line; do echo $line; done"
+ ssh user@host 'find /var  | while read line; do echo ; done'

Como você pode ver, o comando realmente executado é echo sem variável. Para evitar isso, você pode usar aspas simples em vez de duplas:

ssh user@host 'find /var  | while read line; do echo "$line"; done'

Ou, execute o loop while localmente:

ssh user@host find /var  | while read line; do echo "$line"; done

No exemplo acima, o find é executado no host remoto e o while é executado localmente, na saída do comando ssh .

    
por 17.03.2016 / 13:39
1

Evite while read loops.

ssh [email protected] '
  sudo find "/folder/CFGKCP/KCS Pro/Job Setup" -name JOBCFG.info -exec sed -i "
    /^\[General]/,/^\[/ {
      s/^JobRoot = .*/JobRoot = C:\\LOTES\\TMP\\\r/
    }" {} +'

Ou com aspas simples:

ssh [email protected] '
  sudo find "/folder/CFGKCP/KCS Pro/Job Setup" -name JOBCFG.info -exec sed -i '\''
    /^\[General]/,/^\[/ {
      s/^JobRoot = .*/JobRoot = C:\LOTES\TMP\\r/
    }'\'' {} +'

(que \r já é específico do GNU, então você pode usar -i ).

    
por 17.03.2016 / 14:57
0

Obrigado pela explicação sobre a expansão de variáveis em citações, agora eu entendo onde começar meu problema. Eu ainda tenho que pagar com aspas simples aninhadas, porque a ordem em vez do eco as usa. Este é um exemplo mais detalhado:

ssh [email protected] '
    sudo find /folder/CFGKCP/KCS\ Pro/Job\ Setup -name JOBCFG.info|
        while read line; do
            sudo sed '/^\[General\]/,/^\[/ {s/^JobRoot = .*/JobRoot = C:\LOTES\TMP\\r/}' "$line" |sudo tee "$line".modificado; sudo mv -f "$line".modificado "$line";
        done
';
    
por 17.03.2016 / 14:22