SSH 세션에서 변수를 내보내고 다음 쓰기 명령에서 이를 참조하려고 합니다.
sshpass -p "password" ssh -t -t my-box <<EOF
export newUrl="this is a url"
sudo -E sh -c 'echo "url=$newUrl" >> /path/to/file'
exit
EOF
인쇄하는 대신,
url=this is a url
파일에 넣으면 그냥 인쇄됩니다.
url=
동일한 SSH 세션 내에서 변수 값에 액세스할 수 없는 이유는 무엇입니까?
답변1
여기의 문서는 <<EOF
(따옴표 없이)로 표시되므로 여기의 문서 내용은 로 제한됩니다 \$`
. 따라서 $newUrl
여기의 문서는 로컬 셸의 값으로 확장됩니다.
원격 셸에 전달 $newUrl
하고 변수를 확장하려면 $
확장을 방지하거나 \$newUrl
대신 ``< 대신
$newUrl
here-document: 리터럴을 사용할 수 있습니다.<<'EOF'
newUrl
변수를 셸에서 해석할 문자열로 확장합니다 . 이는 변수 값이 문자열이 아닌 쉘 스크립트 조각으로 해석된다는 것을 의미합니다. 값에 셸 특수 문자가 포함되어 있으면 심각한 손상이 발생할 수 있습니다. (어떤 문자가 문제인지는 사용하는 명목상의 대소문자 솔루션에 따라 다릅니다.)
여러 계층의 인용 및 확장을 사용하는 대신 루트로 실행되는 명령에 대한 입력으로 URL을 전달합니다. 그러면 걱정할 것이 없습니다. 이는 sudo가 이를 허용하도록 구성되지 않은 경우에도 -E
작동한다는 추가 이점이 있으며 이는 매우 일반적입니다. sudo sh -c 'cat >>/path/to/file'
파일에 대한 잠재적인 참조 문제를 사용 하거나 방지하는 것이 더 좋습니다 sudo tee -a /path/to/file
.
sshpass -p "password" ssh -t -t my-box <<'EOF'
newUrl="this is a url"
printf '%s\n' "$newUrl" | sudo tee -a /path/to/file
EOF
답변2
sudo를 사용하여 내보내기를 시도해 보세요. 이 변수는 다른 사용자와 함께 sudo를 사용하면 손실됩니다. Defaults env_keep += "newUrl"
sudoers 파일에서도 설정할 수 있습니다 .