4

OS X 10.6を実行しているMacでsudoersファイルを正常に編集するスクリプト(前任者によって作成された)があります。こんなふうになります:

#!/bin/sh

if [ -z "$1" ]; then
    export EDITOR=$0 && sudo -E visudo
else
    echo "%staff ALL=NOPASSWD: /sbin/shutdown" >> $1
fi

ただし、10.7を実行しているMacで実行すると、sudoersファイルに行を追加する代わりに、visudoが「インタラクティブに」起動されます。どの時点でも「else」句を入力していないようです。4行目の適切な構文( "export ...")が変更されたと思われますが、その方法がわからないようです。ポインタはありますか?

誰かが尋ねるので:パッチを適用するための複雑な(そして確かに、ややばかげていますが、必然的にそうです)強制再起動スケジュールがあります。ユーザーが期限までに意図的に再起動しなかった場合、アプリケーションは5分のカウントダウン(またはすぐに再起動するオプション)で起動し、その時点で「sudoshutdown-rnow」コマンドが発行されます。私の正気のために、この取り決めの性質を擁護するように私に頼まないでください。それは私のコントロールの外です。

4

2 に答える 2

2

if [ -z "$1" ];スクリプトに引数が与えられていないかどうかをチェックする一般的なイディオムです。引数なしで呼び出されると、スクリプトは最初のパスを取り、エディターを起動します (この場合、このスクリプト自体である必要があります)。 引数としてファイル名elseを指定すると、 -branch が使用され、行が非対話的に (visudoコンテキスト内で) ファイルに追加されます。

スクリプトが引数なしで外部から呼び出されると仮定すると、sudo は EDITOR 環境変数のクリアを開始するか、(@twalberg が指摘したように) visudo は EDITOR を無視するようになりました。

修正するには、sudoers ファイルを調整して EDITOR を保持し、 を設定して任意のプログラムをエディターとして許可するかenv_editor、スクリプト (および sudoers ファイルを編集するその他のスクリプト) をeditor変数に追加します。

Defaults    env_keep += "EDITOR"
# UNSAFE
#Defaults   env_editor
# better
Defaults    editor = "/usr/bin/vi:/path/to/script" # ... possibly more

それをしたくない場合 (または非対話的に行うことができない場合) で、同時編集が発生しないと想定しても安全な場合は、次のようなことを行うことができます。

cp -p /etc/sudoers /etc/sudoers.tmp
echo "%staff ALL=NOPASSWD: /sbin/shutdown" >> /etc/sudoers.tmp
if visudo -cqf /etc/sudoers.tmp; then
    mv /etc/sudoers.tmp /etc/sudoers
else
    rm /etc/sudoers.tmp
    echo "update failed"
fi
于 2012-07-19T14:15:41.070 に答える