プログラムでファイルを更新する正しい方法は何ですかsudoers
?具体的には:
- 私のファイルに行末を追加し
,timestamp_timeout=600
(残り時間を10時間に増やし)、システムを中断せずにプログラムで実行するにはどうすればよいですか(一度試してみましたが、Linuxシステムが起動せずにインストールを再起動する必要がありました) 。私はこれがこれにとって重要であるかもしれないことを読んだ。Defaults env_reset
sudoers
sudo
chmod 440
- 私はそれが危険であることを知り、それが保護されている理由を理解しています。しかし、これは何十もの簡単な設定変更を実行するスクリプトを持つ私のホームシステムです(そして私はこれらのシステムもかなり定期的に再構築するので、これは私にとって便利です)。これは自動的に実行できます)。
bash
私はスクリプトに置くことができる標準のLinuxツールを使用してこれを行う方法に最も興味がありますが、このような簡単な変更を適用するためにAnsibleで正確なタスクを実行する方法を学ぶことにも非常に興味があります。sudoers
私の家のウェブ上のすべてのファイル。- 存在するこのページドキュメントに議論がありますが、
sudoers
私が参照した内容をよく理解できませんvisudo -c -f
。考える提案は次のとおりです。ファイルのコピーを作成し、そのsudoers
コピーを変更してvisudo -c -f
新しいファイルが有効であることを確認し、上書きして新しいファイルに上書きするsudoers
のchmod 440
は正しいですか?これを実装する手順は不明です。
答え1
警告する:次のように動作します。これが良いアイデアかどうかは議論の余地があります。しかし、これをしたい場合は、この方法は安全性が低い方法の1つです。
ファイルを変更するスクリプトを使用して、呼び出す変数を設定してエクスポートSUDO_EDITOR
するだけです。sed
例えば
export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
visudo
unset SUDO_EDITOR
もちろん、rootとして実行する必要があります。通常は定義されていません...しかし、あなたが望むものを使用したり、あなたが望むものを知らせるために使うことができます(多くのプログラムで使用されるより一般的なEDITORおよびVISUAL環境変数よりもvisudoよりも優先されます。定義されている場合、visudoはそれを使用しますが、SUDO_EDITORSUDO_EDITOR
ではない)。この例では、対話型エディタの代わりにストリームエディタ()を使用しています。visudo
vi
nano
joe
sed
変更が適用されない場合は、visudo
当社がこれを認識し、何をすべきかを尋ねます。あなたのオプションは次のとおりです。
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
オプションを使用する必要がありますx
。再実行されe
、破損した変更が保存されます。sed
Q
しかし、他の変更が必要/etc/sudoers
で、何らかの理由でファイルを直接置くことができない場合は、/etc/sudoers.d/
/ etc / sudoers(例:/ tmp / sudoers)のコピーで変更をテストし、オプション-f
とvisudo
。
正しい変更が行われたことを確認できますdiff
。うまくいけば素晴らしいです-f /tmp/sudoers
。希望の効果が得られるまで繰り返します。cp
visudo
# cp -af /etc/sudoers /tmp/
# export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
# visudo -f /tmp/sudoers
# unset SUDO_EDITOR
# diff -u /etc/sudoers /tmp/sudoers
--- /etc/sudoers 2020-07-18 02:57:35.220317224 +1000
+++ /tmp/sudoers 2021-10-15 03:26:13.048804192 +1100
@@ -9,7 +9,7 @@
Defaults exempt_group=sudo
-Defaults env_reset
+Defaults env_reset,timestamp_timeout=600
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ところで、ここでファイルを変更することは何でも使用できます。 Perl、Python、またはシェルスクリプト(ラッパースクリプトed
やex
他のスクリプト可能なエディタなど)をSUDO_EDITOR
好む場合sed
。指定されたファイルを変更する限り動作しますvisudo
。スペースと入れ子になった引用符に注意してください。
答え2
プログラムで最良の方法は、/etc/sudoers.d
必要なすべてのディレクティブにファイルを追加することです。これらのファイルは0440が所有し、root
モードは0440でなければなりません。ファイルを追加するには/etc/sudoers.d
3つの利点があります。/etc/sudoers
ほとんどの場合、/etc/sudoers
システムのデフォルト設定が維持されるため、変更に関連する将来のアップグレードが簡素化され、/etc/sudoers
デフォルト値の変更を簡単に表示できます。
タイムアウト設定でもファイルを追加できます。Defaults
行が繰り返される可能性があるため、追加
Defaults timestamp_timeout=600
既存の行に追加するのと同じ効果がありますDefaults env_reset
。
これを行うには、次の/etc/sudoers
ものを含める必要があります。
@includedir /etc/sudoers.d
これは最近のインストールのデフォルトですが、sudo
次のようにプログラムでこれを保証できます。
if ! sudo grep -q '^[@#]includedir /etc/sudoers.d$' /etc/sudoers; then
sudo sed '$a\\n@includedir /etc/sudoers.d' /etc/sudoers > /etc/sudoers.new
sudo visudo -c -f /etc/sudoers.new && sudo mv /etc/sudoers{.new,}
fi
SUDO_EDITOR
(ここではこのトリックを使用しないでください。visudo
処理されるためループが/etc/sudoers.d/README
発生します。)@include