Мне нужен способ сделать сценарий выполненным в любом случае при всех пользователях и автоматически запуститься, если какая-либо новая оболочка порождена. Какие-либо идеи?
Я не уверен, под чем Вы подразумеваете 'выполненный в любом случае', таким образом, я не могу ответить что часть, но для остальных.
https://help.ubuntu.com/community/EnvironmentVariables имеет большое объяснение под разделом 'System-wide environment variables''.
, Но вот то, что необходимо знать. Оболочками входа в систему и интерактивными оболочками невхода в систему управляют различные файлы. Таким образом, если Вы захотите, чтобы Ваш сценарий работал, когда ВСЕ оболочки будут запущены, необходимо будет получить сценарий в обоих местах или поместить его в оба места.
Делают сценарий выполненным, когда любая оболочка входа в систему выполняется:
Кавычка из вышеупомянутого источника: Файлы с .sh расширением в/etc/profile.d каталоге выполняются каждый раз, когда оболочка входа в систему удара вводится (например, при входе в систему от консоли или по ssh), а также DisplayManager, когда настольная сессия загружается.
Так просто помещают Ваш сценарий в/etc/profile.d каталог и дают ему .sh расширение.
Делают сценарий выполненным, когда любая интерактивная оболочка невхода в систему выполняется:
В значительной степени то же как прежде, кроме этого времени это не каталог, а файл.
/etc/bash.bashrc будет получен, когда любая интерактивная оболочка невхода в систему будет выполняться. Это означает, что можно или поместить содержание сценария непосредственно в/etc/bash.bashrc, или можно получить сценарий оттуда. Если Ваш сценарий расположен в/etc/myscript.sh, можно получить его путем добавления source /etc/myscript.sh
в/etc/bash.bashrc файл.
... почему? Вероятно, существует лучшее решение, поэтому если Вы заявляете, почему, вероятно, мы можем предлагать некоторые более звуковые решения. Помните, что оболочка используется не только пользователями, но также и большим количеством системных процессов.
Так или иначе, bash
(оболочка по умолчанию), когда запускает его, будет (но видеть позже), выполняют ряд сценариев в масштабе всей системы. Оболочка может запуститься как интерактивная или неинтерактивная, и как вход в систему или не войти в оболочку (см. man bash
и поиск "ВЫЗОВА" для деталей).
В основном, когда пользователь запускает оболочку в терминале на графической сессии, удар вызывается как интерактивный, оболочка невхода в систему и выполнится /etc/bash.bashrc
:
Когда интерактивная оболочка, которая не является оболочкой входа в систему, запускается, удар читает и выполняет команды от/etc/bash.bashrc и ~/.bashrc, если эти файлы существуют. Это может быть запрещено при помощи - norc опция. - rcfile опция файла вынудит удар считать и выполнить команды из файла вместо/etc/bash.bashrc и ~/.bashrc.
Таким образом, можно добавить команды там. Будьте осторожны, хотя, ошибки здесь могут сделать Вашу систему очень трудно для восстановления.
Править /etc/bash.bashrc
и, ПОСЛЕ строки, которая говорит
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
добавьте, например:
echo "Hello $USER, you started a new shell"
и от терминала:
[romano:~] % bash
Hello romano, you started a new shell
romano@RRyS:~$
Если Вы хотите запустить скрипт здесь, осторожны и проверяете дважды, как
if [ -x /full/path/to/script ]; then
/full/path/to/script # double check here
fi
проверьте это дважды /full/path/to/script
не звонит bash
в интерактивном режиме, или у Вас будет хороший бесконечный цикл здесь.
Это нисколько не осуществляется: другие оболочки (zsh
, tcsh
, dash
) будет вести себя по-другому и будет использовать различные файлы. И очевидно любой пользователь может назвать оболочку с
bash --norc --noprofile
и пропустите файлы сценария.
В 14.04 существует даже пример /etc/bash.bashrc
(вероятно, остаток, от когда Ubuntu, переключенная на sudo...
) подсказывать пользователь для использования sudo
вместо того, чтобы войти в систему как корень:
# sudo hint
if [ ! -e "$HOME/.sudo_as_admin_successful" ] && [ ! -e "$HOME/.hushlogin" ] ; then
case " $(groups) " in *\ admin\ *)
if [ -x /usr/bin/sudo ]; then
cat <<-EOF
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
EOF
fi
esac
fi
... но это - археология кода ;-).