원격 서버에서 PMD(Poll Mode Driver)의 CPU 데이터를 추출하려고 합니다. 다음과 같아야 합니다.
pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU
01:48:19 PM UID TGID TID %usr %system %guest %CPU CPU Command
01:48:20 PM 997 - 28553 0.00 0.00 0.00 0.00 14 |__pmd8
01:48:20 PM 997 - 28555 100.00 0.00 0.00 100.00 27 |__pmd9
01:48:20 PM 997 - 28556 100.00 1.00 0.00 100.00 38 |__pmd10
01:48:20 PM 997 - 28557 0.00 0.00 0.00 0.00 39 |__pmd12
01:48:20 PM 997 - 28558 100.00 0.00 0.00 100.00 2 |__pmd11
01:48:20 PM 997 - 28559 100.00 0.00 0.00 100.00 15 |__pmd14
01:48:20 PM 997 - 28560 100.00 1.00 0.00 100.00 3 |__pmd13
01:48:20 PM 997 - 28561 100.00 0.00 0.00 100.00 26 |__pmd15
Average: UID TGID TID %usr %system %guest %CPU CPU Command
Average: 997 - 28553 0.00 0.00 0.00 0.00 - |__pmd8
Average: 997 - 28555 100.00 0.00 0.00 100.00 - |__pmd9
Average: 997 - 28556 100.00 1.00 0.00 100.00 - |__pmd10
Average: 997 - 28557 0.00 0.00 0.00 0.00 - |__pmd12
Average: 997 - 28558 100.00 0.00 0.00 100.00 - |__pmd11
Average: 997 - 28559 100.00 0.00 0.00 100.00 - |__pmd14
Average: 997 - 28560 100.00 1.00 0.00 100.00 - |__pmd13
Average: 997 - 28561 100.00 0.00 0.00 100.00 - |__pmd15
이것은 원격 서버에 보내는 명령 문자열입니다.
ssh -vvvv [email protected] ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'
내가 본 내용은 다음과 같습니다.
pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E pmd\\|%CPU
단일 슬래시여야 하는 이중 백슬래시를 제외하고 모든 것이 정확합니다.
답변1
SSH는 실제로 서버에 보내는 백슬래시 수에 의존하는 것 같습니다. 몇 가지 간단한 예를 살펴보겠습니다.
ssh -v juha@goliath 'echo h\ello'
...
debug1: Sending command: echo h\\ello
hello
...
ssh -v juha@goliath 'echo h\\ello'
...
debug1: Sending command: echo h\\\\ello
h\ello
...
ssh -v juha@goliath 'echo h\\\ello'
...
debug1: Sending command: echo h\\\\\\ello
h\ello
...
ssh -v juha@goliath 'echo h\\\\ello'
...
debug1: Sending command: echo h\\\\\\\\ello
h\\ello
...
SSH가 인용된 명령을 원격 셸에 올바르게 전달하는 것으로 보입니다. 후자의 출력은 로컬에서 명령을 실행할 때 얻는 것과 정확히 같기 때문입니다.
반면에 SSH는 디버그 메시지의 백슬래시 수를 맹목적으로 두 배로 늘리는 것 같습니다. 추가 참조 수준이 도입되는 경우(예:
ssh -v juha@goliath "echo 'h"'\\'"ello'"
...
debug1: Sending command: echo 'h\\\\ello'
h\\ello
...
마지막 예의 인용 체계를 더 명확하게 만들려면 SSH 명령의 마지막 매개변수는 , "echo 'h"
및 '\\'
3 개의 문자열을 연결하는 것입니다 "ello'"
. 로컬 셸은 이를 변환하여 echo 'h\\ello'
먼저 SSH에 전달합니다.
이제 다음 명령을 실행해 보세요.
ssh -vvvv [email protected] ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'
두 개의 작은따옴표 앞에 pidstat
. 이렇게 하면 pidstat -t -p
참조되지 않지만 이로 인해 해를 끼치지는 않습니다. 따라서 위에서 볼 때 원격 셸이 마지막 인수를 올바르게 수신하여 grep
필요에 따라 전달된 pmd\|%CPU
확장 정규식 으로 변환하는 것 같습니다.pmd|%CPU
grep
따라서 이것이 예상대로 작동하지 않으면 백슬래시 수 외에 다른 이유가 있을 수 있습니다.
다음과 같이 백슬래시를 완전히 피하여 이를 확인할 수 있습니다.
ssh -v [email protected] 'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E '"'pmd|%CPU'"
여기서 마지막 매개변수는 두 문자열을 연결한 것입니다: 'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E '
및 "'pmd|%CPU'"
. 로컬 셸은 이를 변환 pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E 'pmd|%CPU'
하여 SSH에 전달합니다.