터미널 벨 소리 방해

터미널 벨 소리 방해
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로컬 호스트로 전송하고 로컬로 비교하는 것입니다.

관련 정보