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
次のようなことが起こります:
- リモート側では、SSH サーバーがシェルを生成します。シェルは、ローカル側から送信された here-document を処理します。
DEBIAN_FRONTEND=noninteractive
シェルで変数を定義します。変数は環境にエクスポートされません。すでに環境変数になっている場合にのみ環境変数になりますが、ほとんどの場合はそうではありません。- シェルは を生成 (または実行) します
sudo
。環境変数のみが継承されるため、sudo
は を認識しませんDEBIAN_FRONTEND
。 sudo
を生成しますapt-get
。たとえツールが を認識していたとしても、 がその子の環境をサニタイズするDEBIAN_FRONTEND
のは通常の動作なので、いずれにしてもは認識しません。sudo
apt-get
DEBIAN_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_keep
sudoers
さらに別の方法:と実際のコマンド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