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

Контекст

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

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

Так, чтобы "simple_user_service" был запущен с "simple_user" полномочиями и не полномочиями пользователя root.

Вопрос

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

export TEST="Hello"

Затем в моем "simple_user_service" init сценарий:

#!/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

ТЕСТОВАЯ переменная установлена и распечатана правильно.

Таким образом, я задавался вопросом: "должностное лицо su simple_user-c" источник команды какой-либо simple_user profile/bashrc файлы? Если так, есть ли способ знать которые?

Большое спасибо за Вашу справку!

[Редактирование - 2 часа спустя]

Благодаря ответу я получил, я понял более точно 'инструкции по ' удара человека. Я нашел это:

   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" сценарий, "Привет" правильно печатается.

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

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

Почему вся эта проблема?

Поскольку я установил рубинового бога: http://godrb.com/ к monitore этот определенный сценарий (отложенное задание одно).

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

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

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

Таким образом, я добавил это в своем сценарии, прежде чем полномочия будут отброшены:

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

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

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

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

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

7
задан 13 October 2015 в 06:02

1 ответ

Когда Вы делаете:

su some_user -c 'some_command'    

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

bash -c 'some_command'

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

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

Отметьте это ~/.profile получен во входе в систему, интерактивной сессии bash и ~/.bashrc получен в невходе в систему, интерактивной сессии bash. Также отметьте ту Ubuntu источники ~/.bashrc от ~/.profile.

Проверьте INVOCATION раздел man bash получить больше идеи.

9
ответ дан 23 November 2019 в 06:29

Другие вопросы по тегам:

Похожие вопросы: