SSH 経由の Debian 10 が `DEBIAN_FRONTEND=noninteractive` を無視する

SSH 経由の Debian 10 が `DEBIAN_FRONTEND=noninteractive` を無視する

Debian 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それらの警告が表示されないようにするためのものです。私は何か誤解しているのでしょうか?

また、コマンドをスクリプトに入れて、コマンドの代わりにスクリプトを実行することも試しました。その後、here docs を使用しないようにしてみましたが、それでもうまくいきませんでした。

答え1

次のようなことが起こります:

  1. リモート側では、SSH サーバーがシェルを生成します。シェルは、ローカル側から送信された here-document を処理します。
  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?回答の1つから:

注意深く読ん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$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

関連情報