3

У меня есть сценарий, предназначенный для настройки моей системы после новой установки операционной системы. Большая часть того, что он делает, требует прав суперпользователя, но некоторые команды создают в домашнем каталоге файлы, такие как файл блокировки, в которые владелец указанного домашнего каталога должен иметь разрешение на запись. Чтобы избежать создания файлов для суперпользователя в моем собственном домашнем каталоге, а не в /root , я требую, чтобы скрипт запускался с помощью sudo -i и использовал sudo -iu "$SUDO_USER" для выполнения команд от имени меня.

Это работает довольно хорошо в большинстве случаев, но теперь мне нужно выполнить команду, как если бы я запускал ее с помощью sudo , а не sudo -i . Как мне это сделать?

Плохое решение будет что-то вроде следующего:

sudo -iu "$SUDO_USER" << LF
sudo [command]
LF

Проблема с вышеупомянутым состоит в том, что sudo [command] может запрашивать пароль, и этот сценарий должен быть неинтерактивным.

1 ответ1

0

Как предположил @ Xen2050, я временно дал себе разрешение выполнить команду от имени суперпользователя без аутентификации.

Я делаю это, добавляя файл в каталог /etc/sudoers.d с помощью директивы NOPASSWD . Чтобы быть в безопасности, я использую visudo , поэтому я должен использовать сценарий ed в here-doc, а не напрямую here-doc. После запуска команды я удаляю файл.

#!/bin/bash

EDITOR=ed visudo -f /etc/sudoers.d/[file] << LF
a
$SUDO_USER $(hostname) = NOPASSWD: [command]
.
wq
LF
sudo -iu "$SUDO_USER" bash << LF
sudo [command]
LF
rm /etc/sudoers.d/[file]

Обратите внимание, что [command] в скрипте ed должна содержать полный путь к команде. Я назвал [file] после команды. В моем случае я запускал установщик для TeX Live, install-tl , поэтому я выбрал его в качестве имени файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .