Какие файлы используются при использовании su -c?

7

Контекст

Вы работаете над Ubuntu LTS 14.04. Вы вошли в систему как пользователь root. Вы выполняете следующую команду:

exec su simple_user -c "/bin/bash /etc/init.d/simple_user_service"

Чтобы «simple_user_service» запускался с привилегиями «simple_user», а не с правами root.

Вопрос

Похоже, что «exec su simple_user -c» не является источником .bashrc, ни .profile, ни любым другим обычным файлом для нового интерактивного терминала оболочки. Я подтвердил, что добавив эту строку в файл simple_user .bashrc:

export TEST="Hello"

Затем в моем сценарии инициализации simple_user_service:

#!/bin/bash
### BEGIN INIT INFO
# Provides:             test_script
# X-Interactive:        true
# Short-Description:    Test script
### END INIT INFO

echo $TEST

Когда я запускаю скрипт, ничего не печатается, но если я выполняю следующие команды:

su simple_user
echo $TEST
> Hello

Переменная TEST установлена ​​и распечатана правильно.

Итак, мне было интересно: использует ли команда exec su simple_user -c любой файл simple_user / bashrc? Если да, есть ли способ узнать, какие из них?

Большое спасибо за вашу помощь!

[Изменить - через 2 часа]

Благодаря ответу, который я получил, я более точно понял инструкции «man bash». Я нашел это:

   When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it  appears  there,  and
   uses the expanded value as the name of a file to read and execute.  Bash behaves as if the following command were executed:
          if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
   but the value of the PATH variable is not used to search for the file name.

Это действительно интересно, поскольку вы можете установить BASH_ENV в файл, который запускает определенные команды каждый раз, когда вы используете «su simple_user -c», не требуя загрузки полной интерактивной логики.

Итак, перед выполнением su simple_user -c вы можете просто сделать:

export BASH_ENV=~/.bash_script

И установите вещи в файле simple_user .bash_script, например:

export TEST="Hello"

Затем, когда я выполняю скрипт «simple_user_service», «Hello» правильно печатается.

Это было действительно полезно для меня, поскольку мне это нужно, чтобы загрузить всю среду «rvm» (ruby) для запуска определенного скрипта.

Хотите узнать больше?

Почему все эти проблемы?

Потому что я установил ruby ​​god: Ссылка , чтобы отобразить этот конкретный скрипт (отложенное задание).

И я использую «rvm» для управления разными рубинами.

И сценарий автоматически отбрасывает привилегии, если необходимо, выполняя exec su application_user -c "/bin/bash application_script"

Как бог должен запускаться с правами root, а rvm загружается только в файлы .bashrc / .profile, мне нужен способ правильно загрузить среду rvm в моем скрипте. Я мог бы просто добавить команду rvm load в скрипт, но тогда мой скрипт был бы зависимым от среды, и это было неприемлемо.

Итак, я добавил это в свой скрипт, прежде чем выпадают привилегии:

if [ -e "config/BASH_ENV" ]; then
  export BASH_ENV=$(cat config/BASH_ENV)
fi

Благодаря этому я могу загрузить rvm в файл, который я установил в файле config / BASH_ENV. Например, это может быть:

# In config/BASH_ENV file of your rails app:
export BASH_ENV="~/.bash_script"

# In /home/simple_user/.bash_script 
[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function

Затем мой сценарий и бог работают, как ожидалось.

Я не объяснял все эти вещи до получения ответов, чтобы читатели могли сосредоточиться на реальном вопросе.

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

Еще раз спасибо!

    
задан Kulgar 13.10.2015 в 10:35
источник

1 ответ

9

Когда вы выполните:

su some_user -c 'some_command'    

some_command будет выполняться как:

bash -c 'some_command'

Предполагая, что bash является оболочкой some_user , определенной в /etc/passwd .

Теперь, когда вы делаете bash -c 'some_command' , вы в основном создаете неинтерактивный (и, конечно, не-login ) сеанс bash . Поскольку файл не загружается оболочкой в ​​неинтерактивном режиме, поэтому файл не читается ожидаемо.

Обратите внимание, что ~/.profile поступает в логин, интерактивный сеанс bash и ~/.bashrc поступает в интерактивный сеанс bash , не входящий в систему. Также обратите внимание, что источники Ubuntu ~/.bashrc из ~/.profile .

Посмотрите раздел INVOCATION man bash , чтобы получить больше информации.

    
ответ дан heemayl 13.10.2015 в 11:04
источник