loc="locationA"
usr="user1"
fw_loc=$(</home/user/Desktop/FW_RULES.txt)
ssh -A -tt [email protected] <<ABC
fw_orig="$fw_loc"
fw_cmpr=\$(ssh root@$loc -o LogLevel=ERROR uci show firewall)
wc --lines <<<"\$fw_orig"
wc --lines <<<"\$fw_cmpr"
diff -s <(echo "\$fw_orig") <(echo "\$fw_cmpr")
exit
ABC
HERE 문서의 변수에 로컬 텍스트 파일을 로드하는 스크립트가 있습니다. 텍스트 파일에는 약이 있습니다. 370줄. 그런 다음 다른 서버의 방화벽 규칙을 가져와 FW 규칙이 일치하는지 비교합니다. 그러나 줄 이후에는fw_orig="$fw_loc"쉘은 자동으로 변수를 확장하고(실제로는 필요하지 않음) 터미널은 다음과 같이 경고음을 울리고 텍스트를 중단합니다.
[user2@jump ~]$ fw_orig="firewall.defaults=defaults
>firewall.poplanhttp3=rule
l
> firewall.poplanhttp3.name='poplanhttp3'
> firewall.lanpopchhttp2.name='lanpopahttp5'
> firewal
> firewall.lanpopchhttp2.dest='POPA'
.
firewall.poplanssh2.dest_port='27'
i
> firewall.poplanssh2.target='ACCEPT'
/
텍스트를 실행할 때마다 다른 줄에서 중단됩니다. 소리가 중단되는 이유는 무엇이며 어떻게 방지할 수 있나요? 흥미로운 점은 나중에 내 스크립트에서 두 변수를 비교하고 줄 수가 일치하지만 diff 명령은 "$fw_orig"의 모든 중단에서 변수 간의 차이점을 찾습니다.
편집하다 파일에 변수를 쓴 다음 비교하려고 할 때:
echo "\$fw_orig">/home/user2/file
..
..
diff -s <(echo "\$fw_orig") /home/user2/file
dif 명령이 반환되었습니다:
Files /dev/fd/63 and /home/user2/file are identical
아마도 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있습니다. 그러나 파일 <> 변수 비교는 작동하지만 변수 <> 변수 비교는 작동하지 않습니다..
답변1
잘못된 라인과 전제 조건 중 일부에만 초점을 맞춰 예제를 단순화하고 불필요한 단계(예: SSH)를 제거해 보겠습니다.
변수 fw_loc
에는 파일의 내용이 포함됩니다. 확실히 많은 줄바꿈과 많은 공백이 있습니다. 아마도 다른 특수 문자도 마찬가지일 것입니다.
나는 그 파일의 내용을 볼 수 없는 반면, 나는 사악한 짓을 하려고 노력합니다. 다음은 해당 파일의 일부 가상의 사악한 내용을 포함하여 수행 중인 작업의 간략한 버전입니다.
fw_loc='foo"; rm -rf "/ouch'
cat <<ABC
fw_orig="$fw_loc"
ABC
이것을 실행하면 다음과 같이 인쇄되는 것을 볼 수 있습니다.
fw_orig="foo"; rm -rf "/ouch"
특별한 경우에는 cat
편집되지 않고 실행을 위해 원격 호스트로 전송됩니다.
탈출 수준은 분명히 충분하지 않습니다. 나는 이것이 당신이 겪고 있는 이상한 행동의 이유라고 생각합니다. 그러나 당신의 경우에 어떤 특수 문자가 실패하는지 잘 모르겠습니다.
한 가지 가능한 접근 방식은 다음을 사용하여 bash(원격 측)의 후속 할당이 제대로 작동하도록 값을 이스케이프하는 것입니다 printf %q
.
fw_loc='foo"; rm -rf "/ouch'
cat <<ABC
fw_orig=$(printf %q "$fw_loc")
ABC
변수 참조 주위에는 즉시 큰따옴표를 사용하도록 주의하십시오 $fw_loc
(그렇지 않으면 printf
제대로 작동하지 않습니다). 그러나 $(...)
명령 대체 주위에는 사용하지 마십시오( printf %q
따옴표 안에 있지 않은 출력에 의존하기 때문입니다)!
이 인쇄
fw_orig=foo\"\;\ rm\ -rf\ \"/ouch
fw_loc
이는 위의 의 정의 와 동일합니다 .
스크립트에서 이 트릭을 몇 번 더 적용해야 할 수도 있지만 여기서는 자세히 살펴보지 않았습니다.
대안적인 해결책은 이 복잡한 논리를 더 작은 단계로 분할하는 것입니다. 예를 들어 를 사용하여 파일을 scp
로컬 호스트로 전송하고 로컬로 비교하는 것입니다.