나는 Bash에서 다음과 같은 간단한 예를 제시합니다.
echo a "b c" d
올바른 출력은 다음과 같습니다.
a b c d
이는 세 개의 인수 배열로 내부적으로 "인코딩"되며, 중간 인수( b
sum 포함 c
)는 4자 길이이고 2개의 공백을 포함합니다. 이것은 set -x
Bash에서 활성화되었을 때의 디버그 출력입니다(대시 아님).
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