ssh me @ remote “script com um loop for e variáveis” - problema com expansão de variáveis em loop no script remoto

0

Nota - Eu postei uma pergunta semelhante ontem e fui um pouco mais longe graças ao @cas, mas ainda estou tendo problemas. Eu refinei a questão, então re-perguntei.

Estou passando o texto do script para um comando ssh (veja abaixo). Dentro do texto do script existem variáveis que devem ser expandidas. $ 1 e $ 2 e $ logfilepattern parecem se expandir bem na string de script. No entanto, $ f não. Eu tentei cada combinação de aspas duplas e aspas simples e escapes que eu posso pensar, mas ainda não consigo fazer isso funcionar. Qualquer ajuda apreciada.

Obrigado Max

#!/bin/bash
logfilepattern="drupal-watchdog.log-201510*.gz"

function getlogcounts {
    echo in getlogcounts
    echo  arg1: "$1"
    echo  arg2: "$2"

    ssh  $1 "cd "$2"; pwd; echo "$logfilepattern" ; for f in "$logfilepattern"; do  echo "$f"; done"
}

server="[email protected] "
logdir="/var/log/mylogs"
getlogcounts $server $logdir 
    
por user12514 05.10.2015 / 06:21

2 respostas

1

Se você deseja incluir aspas duplas entre aspas duplas, precisará

  • encerra a sequência de aspas duplas atual: "
  • escape de uma aspa dupla: \"
  • inicie a sequência de aspas duplas novamente: "

Em outras palavras: "\""

Idem para incluir aspas simples dentro de aspas simples: '\''

Você também precisa escapar de $f com \$f , pois ele existe somente dentro do script de string citado.

ssh  $1 "cd "\""$2"\""; pwd; echo "\""$logfilepattern"\"" ; for f in "\""$logfilepattern"\""; do  echo "\""\$f"\""; done"

Que parece muito feio e é muito difícil de ler e / ou depurar.

Neste caso em particular, como você está controlando a entrada para sua função e pode estar razoavelmente seguro de que não vai dar valores duvidosos (incluindo nomes de arquivos com espaços), você pode se livrar das aspas duplas se você quer. Exceto por "$ f", a menos que você esteja absolutamente certo de que não haverá arquivos correspondentes a $ logfilepattern que contenham espaços ou outros caracteres problemáticos.

ssh $1 "cd $2; pwd; echo $logfilepattern ; for f in $logfilepattern; do  echo "\""\$f"\""; done"

Se a entrada vier de um usuário de alguma forma, por exemplo na linha de comando ou de uma variável de ambiente (especialmente CGI env vars), então você deve (bem, deve) reverter para o estilo defensivo de citar todas as variáveis.

    
por 05.10.2015 / 06:37
0

Você pode tentar o seguinte código:

#!/bin/bash  
logfilepattern="drupal-watchdog.log-201510*.gz"

function getlogcounts {  
    echo in getlogcounts  
    echo  arg1: "$1"  
    echo  arg2: "$2"  

    ssh  $1 "/bin/bash -c ' cd "$2"; pwd; echo "$logfilepattern" ; for f in "$logfilepattern"; do  echo \"\$f\"; done'"
}  

server="[email protected] "  
logdir="/var/log/mylogs"  
getlogcounts $server $logdir   
    
por 05.10.2015 / 07:32