У меня есть скрипт bash, который устанавливает несколько библиотек с открытым исходным кодом (пример:- opencv, octave, ff-mpeg, SDL и т.д.), И мне нужна привилегия sudo для доступа к большинству путей к файлам. Насколько я знаю, по умолчанию сеанс sudo будет длиться 5 минут, после чего мне нужно будет повторно ввести свой пароль, чтобы расширить доступ к sudo.

В моем сценарии установка может занять более 30 минут, поэтому мне нужно снова и снова вводить пароль. Если я запускаю сценарий с привилегией sudo, он устанавливает все без указания пароля, но проблема в том, что он запускает сценарий от имени пользователя root и расширяет все относительные пути в моем сценарии в соответствии с root, а не с обычным пользователем, который запускает сценарий.

например, ответный путь ~/.bashrc расширяется до /root/.bashrc вместо /home/actual_user/.bashrc

2 ответа2

0

в bash разверните тильду до переменной HOME, просто поместите эту команду в верхнюю часть скрипта:

default_user=$(logname 2>/dev/null || echo ${SUDO_USER:-${USER}})
HOME="/home/${default_user}"

используя все тильды в сценарии, вы перейдете в домашний пользовательский каталог, в котором выполняется сценарий, вызвав sudo, так что вы можете просто запустить sudo ./your-script.sh

0

Если установлена переменная HOME , ~ в вашем примере расширяется в соответствии с переменной. Обычно переменная экспортируется в среду.

От man 8 sudo:

-E

Опция -E (сохранить среду) указывает политике безопасности, что пользователь желает сохранить свои существующие переменные среды. Политика безопасности может возвращать ошибку, если указана опция -E и у пользователя нет прав на сохранение среды.

Таким образом, sudo -E your_script - это способ добавить ~/.bashrc в сценарий к /home/actual_user/.bashrc . Обратите внимание, что переменные окружения, кроме HOME , также будут сохранены.

В качестве альтернативы вы можете сохранить только эту одну переменную с

sudo HOME="$HOME" your_script

Это работает "из коробки" в моем Debian, но, пожалуйста, посмотрите man 8 sudo и man 5 sudoers чтобы узнать, как можно ограничивать переменные.

Другой вариант - установить переменную в начале вашего скрипта. Его значение может быть жестко задано или передано в качестве аргумента командной строки.

Имейте в виду, что запуск всего скрипта с помощью sudo имеет недостатки:

  1. Любая ошибка будет кусать вас с повышенными правами.
  2. Если вашему сценарию необходимо знать $HOME фактического пользователя для создания в нем файлов или каталогов, то созданные объекты будут принадлежать пользователю root. Это может стать проблемой позже, когда вы захотите использовать их без sudo . Общая предпосылка - все в вашем домашнем каталоге принадлежит вам (возможные исключения, ну, в общем, исключения).

Возможно, вы можете изолировать повышенную часть сценария, чтобы он полностью выполнялся после однократного ввода пароля, а затем возвращается к родительскому сценарию без повышенных прав, чтобы искажать с помощью /home/actual_user . Как это:

#!/bin/bash

foo1  # runs normally

sudo bash <<EOF
bar1  # runs as if with sudo
bar2  # runs as if with sudo
EOF

foo2  # runs normally

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