Добавление разрешений sudo для sudoers для пользователя через сценарий оболочки

Я пытаюсь создать скрипт после установки для 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: ошибка синтаксического анализа в /etc/sudoers в строке 31 sudo: действительные источники sudoers не найдены, выход из sudo: невозможно инициализировать плагин политики

Как мне это сделать, не испортив файл sudoers?

EDIT: В соответствии с просьбой вот мой файл 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 после запуска скрипта.

EDIT 2: решение состоит в том, чтобы определить $user как user=$(whoami)


person Villi Magg    schedule 29.04.2013    source источник
comment
Это может помочь показать нам, как выглядит ваш файл sudoers.   -  person This isn't my real name    schedule 29.04.2013
comment
@ElchononEdelson Привет и спасибо за ваш ответ. Я отредактировал сообщение, и теперь вы можете просмотреть мой файл sudoers. Спасибо.   -  person Villi Magg    schedule 29.04.2013
comment
Близкие избиратели: хотя это не очень хорошая практика, вопрос о том, как программно манипулировать sudoers, очень реален и определенно актуален здесь, ИМХО.   -  person tripleee    schedule 29.04.2013
comment
Возможно, вы могли бы сделать так, чтобы ваш скрипт сам выполнял sudoers кошки после его изменения. То, что вы показываете здесь, кажется мне нормальным.   -  person This isn't my real name    schedule 29.04.2013
comment
Думаю, я нашел решение своей проблемы. Если я прав, мне нужно сохранить имя пользователя в переменной 'user=$(whoami)', а затем пользователя $user посмотреть, находится ли он в файле sudoers. Я прав?   -  person Villi Magg    schedule 29.04.2013
comment
Чтобы указать, что ваша проблема решена, нужно принять ответ (выбрав зеленую галочку), а не редактировать слово РЕШЕНО в заголовке. Если существующий ответ не решает вашу проблему или не является лучшим решением, не стесняйтесь публиковать и принимать ответ самостоятельно.   -  person Keith Thompson    schedule 01.05.2013


Ответы (3)


Как следует из комментария в конце файла sudoers по умолчанию, вы должны создать новый файл в /etc/sudoers.d/.

Однако делать это из postinst пакета (Debian) кажется подозрительным. Откуда берется значение user?

Кроме того, по какой-то конкретной причине этот пользователь просто не добавлен в одну из существующих групп, admin или sudoers?

person tripleee    schedule 29.04.2013
comment
Привет. Я хочу иметь возможность устанавливать вещи без необходимости вводить пароль после sudo apt-get... - person Villi Magg; 29.04.2013
comment
Я вижу, что вы делаете, и я могу догадаться, что вы пытаетесь собрать, но без подробностей непонятно, то ли вы умничаете, то ли просто делаете это неправильно. Если это ваша единственная цель, зачем вам пакет для этого? И опять же, как и где определяется user? - person tripleee; 29.04.2013
comment
$user определяется как «user=$(whoami)», и именно этого не хватало. Спасибо. - person Villi Magg; 30.04.2013
comment
Но внутри postinst всегда будет root, которому не нужны sudo привилегии. - person tripleee; 30.04.2013

Мое решение состоит в том, чтобы сценарий попросил пользователя ввести свой пароль и сохранить значение в переменной, которая будет использоваться вместе с 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
person Villi Magg    schedule 29.01.2014

Вы можете отредактировать файл /etc/sudoers через "pkexec visudo", после того, как вы удалите плохую строку, sudo заработает.

person Igor Panainte    schedule 28.06.2015