0

Linux 用のポスト インストール スクリプトを作成しようとしていますが、スクリプトで sudoers ファイルを編集して、ユーザーがsudo visudo手動で編集する必要がないようにしたいと考えています。

私が持っているスクリプトでは:

if [[ ! `sudo -l -U "$user" 2>&1 | grep "ALL"` ]]; then
    su -c "echo '$user ALL=(ALL) ALL' >> /etc/sudoers"
    su -c "echo '$user ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers"
fi

これに関する問題は sudo whoami、スクリプトを実行した後に次の出力が得られることです。

sudo: >>> /etc/sudoers: 31 行目付近で構文エラー <<< sudo: 31 行目付近で /etc/sudoers の解析エラーが発生しました sudo: 有効な sudoers ソースが見つかりませんでした。sudo を終了しています: ポリシープラグインを初期化できません

sudoers ファイルを破壊せずにこれを行うにはどうすればよいですか?

編集: 要求されたとおり、ここに私の sudoers ファイルがあります:

Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

cat /etc/sudoersスクリプトの実行後は実行できないことに注意してください。

編集 2: 解決策は、$user を次のように定義することです。user=$(whoami)

4

3 に答える 3

4

デフォルト ファイルの末尾にあるコメントがsudoers示すように、新しいファイルを で作成する必要があります/etc/sudoers.d/

ただし、(Debian) パッケージからこれを行うのpostinstは怪しいようです。の値はuserどこから来るのか?

また、このユーザーが既存のグループの 1 つに単純に追加されない特定の理由、adminまたはsudoers?

于 2013-04-29T16:24:45.110 に答える
1

私の解決策は、スクリプトでユーザーにパスワードを入力し、その値を変数に保存して、 Expectと共に使用するように求めることです。スクリプトは、インストールされていない場合は Expect をインストールし、スクリプトは次のことを行います。

read -p "Please enter your password: " PASSWD
export PASSWD
username=$USER
export username

if [[ ! `sudo -l -U "$USER" 2>&1 | grep "ALL"` ]]; then
  expect -c '
      spawn "su -c \"cat <<EOF >> /etc/sudoers.d/$env(username)
          $env(username) ALL=(ALL:ALL) ALL
          $env(username) ALL=(ALL) NOPASSWD:ALL
EOF
\"
      "
      expect "Password:\r"
      send $env(PASSWD)
      interact
  '
fi
于 2014-01-29T00:03:46.720 に答える