これは安全ですか?
echo "Defaults insults" >> /etc/sudoers
それでは、これを行うことはできますか?
echo "## First line" >> /etc/sudoers
echo "### Second line" >> /etc/sudoers
echo "Defaults insults" >> /etc/sudoers
echo "### Totally the last line" >> /etc/sudoers
これを行うより良い方法はありますかvisudo
?
私はbashスクリプトを作成していますが、この部分では侮辱をオン/オフする必要があります。
ベストアンサー1
これが危険な方法は少なくとも3つあります。
/etc/sudoers
改行文字で終わらない場合(sudo
許可visudo
)、たとえば#includedir /etc/sudoers.d
終了しない行で終わる場合、コマンドは次のように作成します。#includedir /etc/sudoers.dDefaults insults
これにより、そのファイルが破壊され、
sudo
使用できなくなります。echo
たとえば、ファイルシステムがいっぱいになると、文字列全体が書き込まれない可能性があります。たとえば、書き込みのみ可能ですDefaults in
。これによりsudoers
ファイルが破損します。- 複数の管理者がいるシステムで
/etc/sudoers
2人が同時に変更しようとすると、それらが書き込むデータがインターリーブされる可能性があります。
visudo
一時ファイル()を編集し、ファイルが変更されたかどうかを検出できるため、これらの問題を回避できます/etc/sudoers.tmp
(残念ながら、ファイルが変更された場合は検出されません)。正常に修正(エディタの終了状態を確認しないようです)、構文を確認してrename
(原子的タスク)を実行して、新しいファイルを所定の位置に移動します。したがって、ファイルが正常に更新された場合(エディタが新しいファイルを書き込めない場合でもファイルを変更せずに残した場合)、更新できない場合、または構文が無効な場合は失敗します。
visudo
sudoers
また、複数の人が同時にファイルを編集するのを防ぎます。
今、visudo
自動化された方法で安定して使用するのも難しいです。このタスクにはいくつかの問題があります。
visudo
VISUAL
環境変数を使用してエディタコマンド(優先順位)を指定できますが、EDITOR
このenv_editor
オプションが無効になっていない場合にのみ可能です。- 私のバージョンは、
visudo
少なくとも特定の条件で/etc/sudoers
含まれているすべてのファイルを編集します($VISUAL
すべてのファイルに対して実行)。したがって、$VISUAL
修正のみを行ったことを確認する必要があります/etc/sudoers
。 - 上記のようにエディタの終了ステータスを確認しません。したがって、エディタで保存したファイルが正常に作成されたこと、まったく変更されていないことを確認する必要があります。
- 問題が発生すると、ユーザーにメッセージが表示されます。
これらすべての問題を解決するのは少し面倒です。次のことができます。
NEW_TEXT='Defaults insults' \
CODE='
if [ "$2" = /etc/sudoers.tmp ]; then
printf >&2 "Editing %s\n" "$2"
umask 077
{
cat /etc/sudoers.tmp && printf "\n%s\n" "$NEW_TEXT"
} > /etc/sudoers.tmp.tmp &&
mv -f /etc/sudoers.tmp.tmp /etc/sudoers.tmp
else
printf >&2 "Skipping %s\n" "$2"
fi' \
VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null
env_editor
設定しないと効果はありません。
GNUシステムでより良い選択肢はwhichを使うことです。最新バージョンを作成できない場合は、sed -i
変更せずにそのままにしてください。sudoers.tmp
次に追加insults
:
SED_CODE='
/^[[:blank:]]*Defaults.*insults/,${
/^[[:blank:]]*Default/s/!*\(insults\)/\1/g
$q
}
$a\Defaults insults' \
CODE='
if [ "$2" = /etc/sudoers.tmp ]; then
printf >&2 "Editing %s\n" "$2"
sed -i -- "$SED_CODE" "$2"
else
printf >&2 "Skipping %s\n" "$2"
fi' \
VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null
侮辱を取り除きなさい:
SED_CODE='
/^[[:blank:]]*Defaults.*insults/,${
/^[[:blank:]]*Defaults/s/!*\(insults\)/!\1/g
$q
}
$a\Defaults !insults' \
CODE='
if [ "$2" = /etc/sudoers.tmp ]; then
printf >&2 "Editing %s\n" "$2"
sed -i -- "$SED_CODE" "$2"
else
printf >&2 "Skipping %s\n" "$2"
fi' \
VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null