ssh가 원격 명령을 올바르게 이스케이프 처리할 수 없다는 것이 사실입니까?

ssh가 원격 명령을 올바르게 이스케이프 처리할 수 없다는 것이 사실입니까?

나는 Bash에서 다음과 같은 간단한 예를 제시합니다.

echo a "b  c"  d

올바른 출력은 다음과 같습니다.

a b  c d

이는 세 개의 인수 배열로 내부적으로 "인코딩"되며, 중간 인수( bsum 포함 c)는 4자 길이이고 2개의 공백을 포함합니다. 이것은 set -xBash에서 활성화되었을 때의 디버그 출력입니다(대시 아님).

echo a "b  c"  d
+ echo a 'b  c' d
a b  c d

이제 ssh 명령은 이를 완전히 무시하고 내부적으로 잘못된 문자열에 연결하는 것 같습니다. 그렇지 않으면 결과를 해석할 수 없습니다.

$ ssh user@remotehost -- echo a "b  c"  d
+ ssh user@remotehost -- echo a 'b  c' d
a b c d
$ ssh user@remotehost echo a "b  c"  d
+ ssh user@remotehost echo a 'b  c' d
a b c d
$ ssh user@remotehost 'echo a "b  c"  d'
+ ssh user@remotehost 'echo a "b  c"  d'
a b  c d

보시다시피 마지막 줄이 가장 잘 작동하지만 다음과 같이 문자열이 더 복잡해지면 문제가 발생합니다.

$ text="doesn't work"
+ text='doesn'\''t work'

$ echo "$text"
+ echo 'doesn'\''t work'
doesn't work

$ ssh user@remotehost echo "$text"
+ ssh user@remotehost echo 'doesn'\''t work'
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file

$ ssh user@remotehost "echo $text"
+ ssh user@remotehost 'echo doesn'\''t work'
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file

$ ssh user@remotehost "echo \'$text\'"
+ ssh user@remotehost 'echo \'\''doesn'\''t work\'\'''
'doesnt work\

$ ssh user@remotehost "echo '$text'"
+ ssh user@remotehost 'echo '\''doesn'\''t work'\'''
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file

문제는 내가 어디에 있느냐는 것이다.어느원격 명령을 실행하고 모범 사례 방식으로 변수를 전달하는 방법( "$variable"여러 매개변수),그래야 내용에 신경쓰지 않아도 되니까, 아니면 그 내용이 위험합니까?

문제의 원인이 될 수 있는 동일한 제한이 적용되는 것으로 보이며 sh -c다른 명령이 더 나은 작업을 수행합니다(셸을 사용하는 대신 바이너리를 직접 호출합니다).

$ sudo -- echo a 'b  c' d
[sudo] password for user: 
a b  c d

$ nohup echo a 'b  c' d
nohup: ignoring input and appending output to 'nohup.out'
$ cat nohup.out
a b  c d

관련 정보