Bash에서 이 문서의 "$"를 어떻게 에코합니까?
예를 들어, $ABC=home_dir
.
$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF
하지만 변수로 처리됩니다. 텍스트를 인쇄하는 방법은 무엇입니까 $
?
답변1
이를 문서화하고 문서 내용이 확장되거나 특수 문자가 해석되는 것을 원하지 않는 경우 다음과 같이 작은따옴표로 태그를 인용할 수 있습니다.
$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF
그러나 예제에 설명된 상황은 실제로 ssh를 통해 이 콘텐츠를 sudo에 의해 실행되는 원격 시스템으로 전송하기 때문에 더 복잡합니다. 이 시스템은 셸도 호출합니다(따라서 셸도 콘텐츠를 확장합니다). 이를 올바르게 수행하려면 몇 가지 수준의 인용이 더 필요하지만 sudo에는 터미널이 필요하고(비밀번호를 요청할 수 있음) 표준 입력에서 리디렉션되기 때문에 작동하지 않습니다. 여기서는 그것을 사용해도 ssh -t
도움이 되지 않습니다.
나도 존의 말에 동의한다. 이것이 실제로 원하는 것인지는 확실하지 않습니다. 쉘 변수 참조에 값을 할당하는 것은 합법적이지 않으므로 생성하려는 이 파일이 쉘 스크립트인 경우에는 원하는 작업을 수행하지 않습니다. 설명 그런 식으로 작동합니다. 어쩌면 한발 물러서서 자신의 상황을 설명했다면진짜더 많은 일을 하고 싶다면 더 많은 도움을 드릴 수 있습니다.
답변2
도망가다$
$ ssh hostname sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF
귀하의 사용 사례가 무엇인지는 모르지만 일반적으로 home_dir=$ABC
대신 $ABC=home_dir
.
답변3
가장 저렴하게 탈출하는 방법은
$ ssh hostname sudo -s << \EOF
echo "$ABC=home_dir" > file
EOF
답변4
cat
원격 측 프로세스 에 문자열을 보내어 일정량의 인용을 저장할 수 있습니다.
echo 'echo $ABC=home_dir' | ssh hostname sudo -s "cat > file"
작은 따옴표는 $
로컬 측을 보호하고 다른 측의 쉘은 문자열을 다른 쉘 명령에 대한 인수로 사용하는 대신 cat
(를 통해 ) 직접 읽으므로 문자열을 볼 수 없습니다.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