ssh me@remote“" - problem with variable expansion in for loop in remote script

ssh me@remote“" - problem with variable expansion in for loop in remote script

注意 - 我昨天发布了一个类似的问题,并通过 @cas 得到了进一步的信息,但仍然遇到问题。我已经完善了问题,所以重新提出了它。

我将脚本文本传递给 ssh 命令(见下文)。脚本文本内有一些应该扩展的变量。 $1 和 $2 以及 $logfilepattern 似乎在脚本字符串中扩展得很好。然而,$f 却没有。我已经尝试了双引号和单引号的所有组合以及我能想到的转义符,但仍然无法使其工作。任何帮助表示赞赏。

谢谢,麦克斯

#!/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 

答案1

如果你想在双引号内包含双引号,那么你必须

  • 结束当前的双引号字符串:"
  • 转义双引号:\"
  • 再次开始双引号字符串:"

换句话说: "\""

在单引号内包含单引号也是如此:'\''

您还需要转义$fwith,\$f因为它只存在于带引号的字符串脚本中。

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

它看起来非常丑陋并且很难阅读和/或调试。

在这种特殊情况下,当您控制函数的输入并且可以合理地确定您不会给它任何可疑的值(包括带空格的文件名)时,如果您愿意,您可以去掉双引号。除了“$f”之外,除非您绝对确定不会有与 $logfilepattern 匹配的文件包含空格或其他有问题的字符。

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

如果输入以某种方式来自用户,例如在命令行上或来自环境变量(特别是包括 CGI 环境变量),那么您必须(好吧,应该)恢复到引用所有变量的防御风格。

答案2

您可以尝试以下代码:

#!/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   

相关内容