`DEBIAN_FRONTEND=noninteractive`를 무시하고 SSH를 통한 Debian 10

`DEBIAN_FRONTEND=noninteractive`를 무시하고 SSH를 통한 Debian 10

데비안 10을 실행하는 서버에 몇 가지를 설치하기 위해 몇 가지 스크립트를 작성 중입니다.

스크립트는 다음과 같습니다.

#!/usr/bin/env sh

address=$1

ssh -T $address <<EOF > /dev/null
  DEBIAN_FRONTEND=noninteractive
  sudo apt-get install --assume-yes docker.io
EOF

매개변수로 전달되는 스크립트를 실행하면 "[이메일 보호됨]" 다음과 같은 결과가 나타납니다.

debconf: unable to initialize frontend: Dialog
debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin: 

내 이해는 DEBIAN_FRONTEND=noninteractive그러한 경고가 나타나는 것을 방지하기 위한 것입니다. 제가 여기서 뭔가 오해하고 있는 걸까요?

또한 명령을 스크립트에 넣고 명령 대신 스크립트를 실행해 보았습니다. 그런 다음 여기 문서를 사용하지 않으려고 시도했지만 여전히 운이 없습니다.

답변1

일어나는 일은 다음과 같습니다.

  1. 원격 측에서 SSH 서버는 쉘을 생성합니다. 쉘은 로컬 측에서 전송된 여기 문서를 처리합니다.
  2. DEBIAN_FRONTEND=noninteractive쉘에서 변수를 정의합니다. 변수는 환경으로 내보내지지 않습니다. 이미 환경 변수인 경우에만 환경 변수가 됩니다. 아마도 그렇지 않을 것입니다.
  3. 쉘이 생성(또는 실행)됩니다 sudo. 환경 변수만 상속 sudo되므로 DEBIAN_FRONTEND.
  4. sudo생성됩니다 apt-get. 도구가 알고 있더라도 자식의 환경을 위생적 DEBIAN_FRONTEND으로 처리하는 것은 정상 이므로 어쨌든 알 수 없습니다 .sudoapt-getDEBIAN_FRONTEND

이 문제를 처리하려면 변수를 내보내야 합니다. 대신 DEBIAN_FRONTEND=noninteractive보내야 해

export DEBIAN_FRONTEND=noninteractive

원격 쉘에. 그런 다음 sudo양식을 숨기지 않는지 확인해야 합니다 apt-get. 이 질문을 참조하세요:을 사용할 때 환경 변수를 유지하는 방법은 무엇입니까 sudo?답변 중 하나에서 :

주의 깊게 읽고 깃발 man sudo에 주의를 기울여야 합니다 -E. […]

맨 페이지의 인용문은 다음과 같습니다.

-E, --preserve-env
사용자가 기존 환경 변수를 보존하려는 보안 정책을 나타냅니다. 사용자에게 환경을 보존할 권한이 없는 경우 보안 정책에서 오류가 반환될 수 있습니다.

귀하의 경우 여기 문서는 다음과 같습니다.

export DEBIAN_FRONTEND=noninteractive
sudo -E apt-get install --assume-yes docker.io

또 다른 대답은 파일 에서 -E: 없이 살아남아야 하는 변수를 지정하는 방법을 언급합니다 . 이에 대해서는 자세히 설명하지 않겠습니다.env_keepsudoers

또 다른 방법: sudo변수를 와 실제 명령 사이에 배치하여 정의할 수 있습니다 sudo. 단, 변수도 보안 정책에 의해 부과된 제한 사항이 적용됩니다. 다음 코드 조각은 변수를 내보내지 않고도 작동합니다(정책에서 허용하는 경우).

DEBIAN_FRONTEND=noninteractive
sudo DEBIAN_FRONTEND="$DEBIAN_FRONTEND" apt-get install --assume-yes docker.io

<<'EOF'로컬 측에서 변수 확장을 방지하는 대신 여기 문서가 필요하다는 점에 유의하십시오 <<EOF(또는 escape 필요 $). 이것은 점점 복잡해지고 있으며 좋은 소식은 원격 셸에 변수가 전혀 필요하지 않다는 것입니다. 귀하의 경우 이는 다음에 대한 올바른 변수를 정의하기에 충분해야 합니다 apt-get.

sudo DEBIAN_FRONTEND=noninteractive apt-get install --assume-yes docker.io

마지막으로 보안 정책에서 이 변수 ​​지정을 허용하지 않는 경우 sudo또 다른 쉘을 생성할 수 있습니다.

sudo sh -c 'DEBIAN_FRONTEND=noninteractive apt-get install --assume-yes docker.io'

그러나 이러한 제한적인 정책 으로 인해 애초에 실행이 불가능할 것으로 예상되므로 마지막 명령은 실제적으로 중요하지 않을 수 sh있습니다 .sudo

관련 정보