
참고 - 어제 비슷한 질문을 게시하고 @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
큰따옴표 안에 큰따옴표를 넣으려면 다음을 수행해야 합니다.
- 현재 큰따옴표로 묶인 문자열을 종료합니다.
"
- 큰따옴표를 이스케이프하세요:
\"
- 큰따옴표로 묶인 문자열을 다시 시작합니다.
"
다시 말해서: "\""
작은따옴표 안에 작은따옴표를 포함하는 경우에도 마찬가지입니다.'\''
또한 인용된 문자열 스크립트에만 존재하므로 $f
with로 이스케이프해야 합니다 .\$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