ssh 나@원격"" - problem with variable expansion in for loop in remote script

ssh 나@원격"" - 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   

관련 정보