SSH 세션 내에서 내보낸 변수가 비어 있습니다.

SSH 세션 내에서 내보낸 변수가 비어 있습니다.

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대신 ``< 대신 $newUrlhere-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 파일에서도 설정할 수 있습니다 .

관련 정보