Выписка из программ UID набора и уязвимостей:
– Вспомните, что система () вызывает/bin/sh сначала. В Fedora это execv/bin/sh с аргументами "sh", "-c" и пользователем обеспечил строку.
– В Fedora,/bin/sh (на самом деле удар) игнорирует опцию бита UID набора. Поэтому, когда invok-система луга (cmd) в программе UID набора, cmd не будет выполняться с полномочием пользователя root, если сам cmd не будет программой UID набора. Следующий код в ударе отбрасывает бит UID набора. На самом деле я не могу думать ни о какой законной причине, почему мы должны позволить программную оболочку UID набора. Fedora делает правильную вещь; много других Ose Unix не сделали этого.
Согласно этому 1.out не установлен, uid и a.out отбрасывают полномочия прежде, чем выполнить его.
Среда не является столь волшебной, как это могло бы казаться. Оболочка хранит его в памяти и передает execve()
системный вызов. Дочерний процесс наследовал его как названный указатель массива environ
. От execve
страница справочника:
РЕЗЮМЕ
#include <unistd.h> int execve(const char *filename, char *const argv[], char *const envp[]);
argv
массив строк аргумента, переданных новой программе.
Условно, первая из этих строк должна содержать имя файла, связанное с выполняемым файлом.envp
массив строк, традиционно формы key=value, которые передаются как среда новой программе.
environ(7)
страница справочника также предлагает некоторое понимание:
РЕЗЮМЕ
extern char **environ;
ОПИСАНИЕ
Переменная
environ
точки к массиву указателей на строки назвали "среду". Последний указатель в этом массиве имеет значениеNULL
. (Эта переменная должна быть объявлена в пользовательской программе, но объявляется в заголовочном файле<unistd.h>
в случае, если заголовочные файлы прибыли из libc4 или libc5, и в случае, если они произошли из glibc, и _GNU_SOURCE был определен.) Этот массив строк сделан доступным для процесса должностным лицом (3) вызов, который запустил процесс.
Обе из этих страниц справочника GNU соответствуют спецификации POSIX
У Вас есть он просто немного неправильное: SOME_NAME=value
создает переменную оболочки (в большинстве оболочек). export SOME_NAME=value
создает переменную среды. Для лучше для для худшего, большая часть Unix/Linux / *BSD оболочки использует идентичный синтаксис в доступе к переменным среды и окружает переменные.
В некотором большем смысле "среда" является просто информацией, которая соглашается с выполнением программы. В программах C Вы могли бы найти идентификатор процесса с a getpid()
звоните в программной оболочке, Вы использовали бы переменный доступ: $$
. Идентификатор процесса является просто частью среды программы. Я полагаю, что термин "среда" прибывает из некоторых более теоретических тем информатики, как моделирование выполнения программы.. Модели выполнения программы имеют среду, "которая содержит ассоциации между переменными и их значениями".
И это последнее, более сильное определение - то, что "среда" для Unix/Linux / *BSD оболочки: ассоциация между именами ("переменные") и их значения. Для большинства оболочек стиля Unix значения являются всеми символьными строками, хотя это не так строго верно, как это раньше было. Ksh, Zsh и Bash у всех есть переменные определенного типа в эти дни. Даже оболочка функциональные определения может быть экспортирована.
Использование среды, отдельной от простых переменных оболочки, включает fork/exec
метод запуска нового процесса, который используют все Unixes. Когда Вы export
пара имя/значение, та пара имя/значение будет присутствовать в среде новых исполняемых файлов, запущенных оболочкой с execve(2)
системный вызов (обычно после a fork(2)
, кроме тех случаев, когда exec
команда оболочки использовалась).
После execve()
, main()
функция нового двоичного файла имеет свои параметры командной строки, среда (сохраненный как ЗАВЕРШЕННЫЙ ПУСТЫМ УКАЗАТЕЛЕМ массив указателей на var=value
строки, посмотрите environ(7)
страница справочника). Другое состояние это наследовано, включает ulimit
настройки, текущий рабочий каталог и любые открытые дескрипторы файлов, что execve()
у вызывающей стороны не было набора FD_CLOEXEC для. Текущее состояние tty (эхо включило, режим без предварительной обработки, и т.д.) можно было также считать частью режима выполнения, наследованного недавно -exec
процесс редактора.
Посмотрите bash
описание руководства среды выполнения для простых команд (кроме встроенного или функций оболочки).
Среда Unix отличается по крайней мере от некоторых других операционных систем: VMS "lexicals" мог быть изменен дочерним процессом, и то изменение было видимо в родителе. VMS cd
в дочернем процессе влиял бы на рабочий каталог родителя. По крайней мере, при некоторых обстоятельствах и моей памяти может приводить меня к сбою.
Некоторые переменные среды известны, $HOME
, $PATH
, $LD_LIBRARY_PATH
и другие. Некоторые являются стандартными к данной системе программирования, так, чтобы родительская оболочка могла передать партии и большую информацию специального назначения к некоторой программе, как определенный временный каталог, или идентификатор пользователя и пароль, которые не обнаруживаются в ps -ef
. Простые программы CGI наследовали большую информацию от веб-сервера через переменные среды, например.
SOME_NAME=value command
установит переменную среды SOME_NAME для того вызова команды. Смутно, это, кажется, не устанавливает переменную оболочки того же имени.
– Samuel Edwin Ward
18.09.2013, 22:54
SOME_NAME=value command
ведет себя вопреки Вашему ожиданию, то, что это - специальный синтаксис, означающий, "добавьте, что SOME_NAME к среде передал команде, но иначе не изменяйте переменные этой оболочки".
– msw
18.09.2013, 23:46
fork()
редактор, но они действительно получают (копии) переменные оболочки.
– ruakh
19.09.2013, 08:53
Переменные среды в их самой сырой форме являются просто рядом пар имя/значение. Как описано в странице справочника удара (man 1 bash
) под разделом ENVIRONMENT:
When a program is invoked it is given an array of strings called the
environment. This is a list of name-value pairs, of the form
name=value.
The shell provides several ways to manipulate the environment. On
invocation, the shell scans its own environment and creates a parameter
for each name found, automatically marking it for export to child pro-
cesses. Executed commands inherit the environment.
На практике это позволяет Вам определять поведение, которое совместно используется или уникально для программ, вызванных от существующей оболочки. Например, при использовании crontab
или visudo
можно определить EDITOR
переменная среды для определения другого редактора кроме того система использовала бы по умолчанию. То же может сохраняться для вещей как man
команда, которая смотрит на Ваш PAGER
среда для разработки то, с чем программа пейджера должна использоваться для отображения вывода страницы справочника.
Довольно много команд Unix читает среду и в зависимости от того, что установлено, там изменяют их вывод/обработку/действие в зависимости от них. Некоторые совместно используются, некоторые уникальны для программы. Большинство страниц справочника содержит информацию о том, как переменная среды имеет эффект на описанную программу.
Другие практические иллюстрации для вещей, таких как системы с несколькими установками Oracle на той же платформе. Путем установки ORACLE_HOME
, целый комплект команд оракула (как загружено из Вашего PATH
переменная среды), затем вытягивают настройки, определения, отображения и библиотеки из-под того высокоуровневого каталога. То же сохраняется для других программ, таких как Java с, он JAVA_HOME
переменная среды.
сам удар имеет много переменных среды, которые могут изменить поведение диапазона вещей из истории (HISTSIZE
, HISTFILE
и т.д.), размер экрана (COLUMNS
), заполнение клавишей Tab (FIGNORE
,GLOBIGNORE
) локаль и кодировка символов / декодирующий (LANG
, LC_*
), подсказка (PS1
.. PS4
), и т.д (снова ищут знание из страницы справочника удара).
Также можно записать сценарии/программы, которые используют собственные переменные среды (для передачи настроек или функциональности изменения).
"Переменные среды" являются рядом динамических именованных значений, которые могут влиять на способ, которым процессы выполнения будут вести себя на компьютере.
Они - часть операционной среды, в которой работает процесс. Например, рабочий процесс может запросить значение ВРЕМЕННОЙ переменной среды, чтобы обнаружить, что подходящее местоположение хранит временные файлы или переменную ДОМАШНЕГО или ПРОФИЛЯ ПОЛЬЗОВАТЕЛЯ для нахождения структуры каталогов принадлежавшей пользователю, выполняющему процесс.
Больше информации здесь → http://en.wikipedia.org/wiki/Environment_variable.
Все Вы хотите знать о Переменных среды... ↑
Для этого ответа требуется некоторый опыт написания сценариев оболочки и знание терминов переменная, значение, подстановка переменных, приглашение, эхо, ядро, оболочка, утилита, сеанс и процесс.
Переменная среды (envar )представляет собой набор глобальных определенных переменных, которые могут влиять на то, как данные процессы будут вести себя в операционной системе компьютера.
Мы заменяем envars $
и заглавными буквами . Например:$PS1
.
Таким образом мы можем напечатать envar:
echo $PS1
$PS1
содержит значение приглашения Unix. Скажем, его родные значения\u
\w
$
.
\u
означает (текущий )пользователь, \w
означает рабочий каталог, $
должен граничить с подсказкой. Итак, если мы выполним :echo $PS1
, мы увидим значения \u
, \w
плюс знак доллара в конце.
Мы могли бы изменить поведение Unix в этом контексте, если бы мы изменили значения этого envar. Например:
PS1="\w >"
Теперь подсказка выглядит следующим образом (при условии, что рабочий каталог называется "John"):
John >
Таким же образом мы могли бы сделать PS1="Hello, I'm your prompt >"
, поэтому echo $PS1
принесет:
Hello, I'm your prompt >
В Bash 4.x.x мы можем распечатать ВСЕ переменные в системе с помощью команды env
. Я предлагаю выполнить env
в терминале и посмотреть на вывод.
Терминал сеанса позволяет нам настраивать envars, поставляемые с Bash.
Вышеупомянутые изменения обычно носят временный характер, и вот почему:
Каждый сеанс (, который не является под-сеансом ), уникален, и одновременно могут выполняться несколько процессов (, каждый со своим собственным набором переменных ), но обычно является наследованием от сеанса 0 до сеанса 1 и выше.
Изменения, которые мы вносим в один процесс, уникальны для него и исчезнут, если мы закроем его, не сохранив их каким-либо образом.
Существует несколько способов хранения изменений envar, в зависимости от выбранной области. Вот разные области (уровней )для таких изменений:
Unix состоит из трех основных слоев. :Ядро, оболочка и утилиты. Насколько я знаю, каждая оболочка имеет свои собственные envars, и они создаются в основном или исключительно в оболочке.
Конкретное место для их глобального изменения обычно /etc/profile
, хотя мы также можем сделать это в .bashrc
, конечно.
Мы можем создавать новые envars, и вот способ; начиная с Bash 4.x.x нет собственного энавара с именем MESSAGE
(, как было сказано, энвары обычно пишутся в верхнем регистре ).
MESSAGE="Hello world!"
создаст его для нас, и теперь, если мы наберем echo $MESSAGE
, мы получим hello world!
.
Если мы выполним bash
в нашем текущем рабочем сеансе (окно ), мы запустим новый сеанс bash sub -и больше не будем работать в исходном процессе, если мы не выполним exit
.
Примечание :В операционных системах с эмулятором терминала (, таким как рабочий стол Ubuntu ), дополнительный сеанс -обычно выполняется в том же окне, но новый сеанс в другом окне не является дополнительным -сеанс существующего (это смежный процесс ).
Примечание. :Не используйте специальные знаки в значениях envar, например ! или они не будут сохранены.
Мы по-прежнему можем использовать envar, созданный в первом сеансе, и во втором, не регистрируя его в файлах конфигурации пользователя или глобального уровня (см. следующие данные ). Вот как это сделать:
Перейти к исходному сеансу (в текущем или другом окне )и выполнить:
export MESSAGE
при экспорте не используйте знак $
.
Теперь он экспортируется во все подсеансы -. Если вы сделаете echo $MESSAGE
в подсеансе -, будь то от вашего пользователя или другого, он будет распечатан.
Обратите внимание, что внутренние переменные оболочки, такие как PS1
, не следует экспортировать, но если вы хотите экспортировать их по какой-либо причине и они не отображаются, не выполняйте bash
после export
, а bash –norc
.
$PATH
— это envar, который пользователи обычно меняют чаще всего.
Если мы echo $PATH
, мы увидим этот поток:
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Печатные значения этого envar разделены двоеточием (:)там, но здесь потенциально более удобный способ (это те же те же значения):
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games
Это каталоги для поиска при запуске утилиты.
Выполнив which echo
, мы получим местоположение файла -, например, мы можем увидеть, что он существует в /bin/echo
.
Исходя из этого, нам не нужно вводить echo envar для просмотра значений evnar. Мы также можем сделать:
/bin/echo $ENVAR
Envar все равно будет выполняться, например:
/bin/echo $HOME
Дает нам
/home/User || /root
Так же, как:
echo $HOME
Дает нам
/home/User || /root
Примечание:$HOME
сокращено до ~
.
В Bash 4.x.x, когда мы используем утилиту без полного пути, система будет использовать все 6 значений, упомянутых выше, из $PATH
envar. Таким образом, он начнется с /user/local/bin
и будет следовать всему своему содержимому в поисках исполняемого файла echo
.
В этом случае он остановится на /bin/echo
, в котором в данном случае находится исполняемый файл.
Следовательно, основная причина, по которой мы можем настроить envar $PATH
, заключается в установке исполняемых файлов, которые не находятся ни под одним из его собственных значений.
После установки таких исполняемых файлов мы должны установить их значение $PATH
соответствующим образом, и тогда мы сможем с ними работать.
$PATH
:Таким образом мы можем export $PATH
запускать под-сеансы (, которые включают расширения bash, такие как WP -CLI для WordPress или Drush для Drupal ):
export PATH="/home/John:$PATH"
Это добавит новое значение /home/John
к $PATH
, а затем сразу же присоединит к нему все собственные значения (сразу после двоеточия ), которые хранятся в соответствии с синтаксисом $PATH
.
Такое постоянное изменение можно сделать в соответствующем скрипте, обычно под /etc/profile
и под именем .bashrc
.
exec(3)
семейство (т.е. те, которые не соответствуют exec*v) передача **, окружает под покрытиями. – msw 18.09.2013, 23:50exec*e
варианты, которые явно передают ENV, вместо того, чтобы неявно использоватьenviron
глобальная переменная.v
означает "вектор" и относится к параметрам командной строки, переданным как массив (а не "список" (функция переменной длины))execve
системный вызов и все другиеexec*
функции являются libc обертками для него. – Peter Cordes 19.04.2015, 17:38