답변:
here-doc을 작성하고 doc을 확장하거나 특수 문자를 해석하지 않으려면 다음과 같이 작은 따옴표로 레이블을 인용하십시오.
$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF
그러나 예제에 설명 된 상황은 실제로 ssh를 통해 원격 시스템 으로이 내용을 전송하여 쉘을 호출하는 sudo에 의해 실행되기 때문에 쉘이 내용을 확장하기 때문에 훨씬 복잡합니다. 게다가). 이 권리를 얻으려면 더 많은 인용문이 필요하지만 sudo에는 터미널이 필요하므로 (암호를 요청할 수 있음) stdin에서 리디렉션되었으므로 여전히 작동하지 않습니다. 사용하더라도 ssh -t
여기에 도움이되지 않습니다.
또한 Johan에 동의합니다. 이것이 실제로 원하는 것인지 확실하지 않습니다. 쉘 변수 참조에 값을 할당하는 것은 합법적이지 않으므로 작성하려는이 파일이 쉘 스크립트 인 경우 설명 된대로 작동하지 않습니다. 약간 백업하고 실제로 원하는 것을 설명하면 더 많은 도움을 줄 수 있습니다.
탈출 $
$ ssh hostname sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF
나는 당신의 유스 케이스가 무엇인지 모르지만 일반적으로 home_dir=$ABC
대신에 당신이 원합니다 $ABC=home_dir
.
=home_dir
. 물론 유스 케이스가 무엇인지 모르겠다.
$
이 원격 쉘로 전송되지만 문자열이로 에코되기 전에 해당 쉘이 확장 $ABC
됩니다 file
. $
파일에 리터럴을 쓰려면 echo "\\\$ABC=home_dir"
원격 쉘이 수신 할 수 있도록 또 다른 (이스케이프 된) 백 슬래시 :가 필요합니다 echo "\$ABC=home_dir"
.
문자열을 cat
원격 쪽 프로세스에 보내서 인용 수준을 저장하십시오 .
echo 'echo $ABC=home_dir' | ssh hostname sudo -s "cat > file"
작은 따옴표 $
는 로컬 끝을 보호하고 문자열은 다른 셸 명령에 대한 인수가 아닌 cat
(via sudo
)로 직접 읽으므로 다른 셸에서 문자열을 볼 수 없습니다 .
코드를 사용하면 다음을 보호하기 위해 추가 이스케이프 레이어가 필요합니다 $
.
$ ssh hostname sudo -s <<EOF
echo "\\\$ABC=home_dir" > file
EOF
\$
원격 쉘이 $
파일에 리터럴 을 쓰도록 원격 호스트에 리터럴을 보내야 합니다. here-doc 마커를 인용하여이를 단순화 할 수도 있습니다.
$ ssh hostname sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF