SSH를 통해 원격으로 문자열을 실행하려고 하는데 백슬래시가 계속 반복됩니다.

SSH를 통해 원격으로 문자열을 실행하려고 하는데 백슬래시가 계속 반복됩니다.

원격 서버에서 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|%CPUgrep

따라서 이것이 예상대로 작동하지 않으면 백슬래시 수 외에 다른 이유가 있을 수 있습니다.

다음과 같이 백슬래시를 완전히 피하여 이를 확인할 수 있습니다.

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에 전달합니다.

관련 정보