Запустить часть bash-скрипта от имени другого пользователя

Вопрос или проблема

Я на Ubuntu 9.04. Есть ли способ сделать так, чтобы часть скрипта выполнялась от имени другого (не root) пользователя? Если это поможет, часть, которая должна выполняться от имени другого пользователя, находится в конце скрипта.

Используйте команду sudo в скрипте.

В следующем формате:

sudo -u имя_пользователя команда

команда sudo выполняет команду от имени пользователя имя_пользователя.

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

# Мне нравится:

#проверить, работает ли bash от имени другого пользователя
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Запускает bash с командами между '_' от имени nobody, если это возможно
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# ./run

1: root
2: nobody
3: root

Этот ответ хороший, но совет serverfault немного опасен – позволит любому запускать что угодно от имени root! Поэтому я публикую здесь, потому что не могу отформатировать комментарий.

Я бы рекомендовал использовать visudo, чтобы дать необходимые права так точно, как это возможно. Введите visudo и добавьте строку вроде:

имя_пользователя хост = NOPASSWD: /полный/путь/к/команде1, полный/путь/к/команде2

Если вам нужно выполнить то же самое на многих хостах, вы можете открыть его с помощью:

имя_пользователя ВСЕ = NOPASSWD: /полный/путь/к/команде1, полный/путь/к/команде2

Но я бы **не* использовал ни:

имя_пользователя ВСЕ=(ВСЕ) NOPASSWD: ВСЕ

или
имя_пользователя хост = ВСЕ

Страница man sudoer содержит множество деталей

Таким образом, конец скрипта будет выполняться другим пользователем (root). Обратите внимание на вызовы $[LINENO+2] и exit $?. Эти вызовы необходимы, чтобы конец скрипта выполнялся только один раз и для сохранения кода возврата вызова sudo.

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# передайте остальную часть этого скрипта через вызов sudo                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1

Для sonarqube:

sudo -u sonar /usr/bin/sonar start

где sonar – это имя пользователя, используемого для выполнения команды /usr/bin/sonar start

не уверен в этом, но если вы хотите, чтобы ТОЛЬКО конец этого скрипта выполнялся от имени другого пользователя, вы могли бы добавить su someuser перед концом скрипта.

Я что-то пропустил?

Надеюсь, это поможет,

С уважением

У меня была похожая потребность, как у автора, у меня был довольно большой shell-скрипт, который нужно было запустить от имени root, но большая часть которого должна быть выполнена от имени другого пользователя. Моё решение заключалось в том, чтобы поместить все содержимое скрипта (как ту часть, которую нужно выполнить от имени root, так и ту часть, которую нужно выполнить от имени “другого пользователя”) в блок if/elif:

if [ $USER = "other_user" ]
then
   ## Выполняем команды от имени другого пользователя
   :
   exit
elif [ $USER = "root" ]
then
   ## Выполняем некоторые команды от имени root
   :
   ## Далее, выполняем этот скрипт от имени другого пользователя
   sudo -i -u other_user $0 "$@"
   ## Затем выполняем еще команды от имени root
   :
else
   ## Никто другой не должен запускать этот скрипт
   echo "Доступ запрещен"
   exit 1
fi

О Боже! Есть команда runuser в пакете GNU/Linux util-linux.

Примеры:

runuser -l <имя_пользователя> -c 'echo "работаю как: $USER, с домашним каталогом: $HOME"'

# с конкретной оболочкой и некоторыми переменными из контекста root:
runuser -l <имя_пользователя> -s /bin/bash -c 'diff -q \"'$file1'\" \"'$file2'\"' &>/dev/null"

Ответ или решение

Чтобы выполнить часть Bash-скрипта от лица другого пользователя на Ubuntu 9.04, можно использовать команды sudo или runuser. Оба метода позволяют запускать команды с правами другого пользователя, при этом важно учитывать безопасность и правильность конфигурации системы.

Использование sudo

Команда sudo позволяет запустить определенные команды от имени другого пользователя. Для этого используйте следующий синтаксис:

sudo -u имя_пользователя команда

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

Настройка файла sudoers

Откройте файл настроек sudoers:

sudo visudo

Добавьте строку для предоставления прав без запроса пароля для обозначенной команды:

имя_пользователя hostname = NOPASSWD: /полный/путь/к/команде

Это позволит пользователю запускать указанные команды без необходимости вводить пароль. Будьте осторожны с определением прав, чтобы не открыть доступ к потенциально опасным командам.

Пример использования sudo в скрипте

Рассмотрим простой пример скрипта, который выполняет команду от имени другого пользователя в его конце:

#!/bin/bash
echo "Текущий пользователь: $USER"

# Выполнить команду от имени другого пользователя
sudo -u другой_пользователь bash -c 'echo "Запуск от имени: $USER"'

В этом случае, если вы выполните скрипт от имени root, команда выведет имя пользователя другой_пользователь.

Использование runuser

Команда runuser также может использоваться для выполнения команд от имени другого пользователя, но она не подходит для запуска скриптов, так как используется чаще всего для выполнения единственной команды. Пример использования:

runuser -l другой_пользователь -c 'echo "Запуск как: $USER"'

Как и в случае с sudo, это обеспечит выполнение команды от имени другой_пользователь.

Пример комплексного решения

Если у вас есть большой скрипт, который должен выполняться от имени root, а затем часть его должна выполняться от имени другого пользователя, вы можете комбинировать различные методы. Например:

#!/bin/bash

if [ "$USER" = "другой_пользователь" ]; then
    # Команды для выполнения от имени другого пользователя
    echo "Эти команды выполняются от имени: $USER"
    exit
elif [ "$USER" = "root" ]; then
    # Команды выполняются от имени root
    echo "Эти команды выполняются от имени: $USER"
    # Выполнить часть скрипта от имени другого пользователя
    sudo -u другой_пользователь $0 "$@"
    exit
else
    echo "Доступ запрещен"
    exit 1
fi

В этом коде, если скрипт запускается от имени root, он запустит себя заново от имени другой_пользователь. Если скрипт запущен другим пользователем, будет выведено сообщение об ошибке.

Заключение

Запускать часть скрипта от другого пользователя в Bash возможно с помощью sudo или runuser. Обязательно учитывайте безопасность и правильную конфигурацию прав доступа для предотвращения несанкционированного доступа к системе. Правильная настройка файла sudoers и осознанное использование команд обеспечит безопасность и эффективность ваших скриптов.

Оцените материал
Добавить комментарий

Капча загружается...