Это не ответ как таковой. Это - второстепенный вопрос о sed
.
А именно, я должен был взять Gilles sed
управляйте независимо, чтобы часть частью поняла это... Я начал писать некоторые записки на нем и затем думал, что это может быть полезно здесь для кого-то...
таким образом, здесь это... sed сценарий жабр в зарегистрированном формате:
#!/bin/bash
#######################################
sed_dat="$HOME/ztest.dat"
while IFS= read -r line ;do echo "$line" ;done <<'END_DAT' >"$sed_dat"
foo bar \
bash \
baz
dude \
happy
yabba dabba
doo
END_DAT
#######################################
sedexec="$HOME/ztest.sed"
while IFS= read -r line ;do echo "$line" ;done <<'END-SED' >"$sedexec"; \
sed -nf "$sedexec" "$sed_dat"
s/\\$// # If a line has trailing '\', remove the '\'
#
t'Hold-append' # branch: Branch conditionally to the label 'Hold-append'
# The condition is that a replacement was made.
# The current pattern-space had a trailing '\' which
# was replaced, so branch to 'Hold-apend' and append
# the now-truncated line to the hold-space
#
# This branching occurs for each (successive) such line.
#
# PS. The 't' command may be so named because it means 'on true'
# (I'm not sure about this, but the shoe fits)
#
# Note: Appending to the hold-space introduces a leading '\n'
# delimiter for each appended line
#
# eg. compare the hex dump of the follow 4 example commands:
# 'x' swaps the hold and patten spaces
#
# echo -n "a" |sed -ne 'p' |xxd -p ## 61
# echo -n "a" |sed -ne 'H;x;p' |xxd -p ## 0a61
# echo -n "a" |sed -ne 'H;H;x;p' |xxd -p ## 0a610a61
# echo -n "a" |sed -ne 'H;H;H;x;p' |xxd -p ## 0a610a610a61
# No replacement was made above, so the current pattern-space
# (input line) has a "normal" ending.
x # Swap the pattern-space (the just-read "normal" line)
# with the hold-space. The hold-space holds the accumulation
# of appended "stripped-of-backslah" lines
G # The pattern-space now holds zero to many "stripped-of-backslah" lines
# each of which has a preceding '\n'
# The 'G' command Gets the Hold-space and appends it to
# the pattern-space. This append action introduces another
# '\n' delimiter to the pattern space.
s/\n//g # Remove all '\n' newlines from the pattern-space
p # Print the pattern-space
s/.*// # Now we need to remove all data from the pattern-space
# This is done as a means to remove data from the hold-space
# (there is no way to directly remove data from the hold-space)
x # Swap the no-data pattern space with the hold-space
# This leaves the hold-space re-initialized to empty...
# The current pattern-space will be overwritten by the next line-read
b # Everything is ready for the next line-read. It is time to make
# an unconditional branch the to end of process for this line
# ie. skip any remaining logic, read the next line and start the process again.
:'Hold-append' # The ':' (colon) indicates a label..
# A label is the target of the 2 branch commands, 'b' and 't'
# A label can be a single letter (it is often 'a')
# Note; 'b' can be used without a label as seen in the previous command
H # Append the pattern to the hold buffer
# The pattern is prefixed with a '\n' before it is appended
END-SED
#######
Существует несколько частей к тому, что делают программы входа в систему. Программы входа в систему отличаются по тому, как они взаимодействуют с пользователем, который пытается войти в систему. Вот несколько примеров:
login
: чтения вводятся на текстовом терминалеsu
: вызванный уже зарегистрированными пользователями, получает большинство данных из его параметров командной строки, плюс данные аутентификации (пароль) от терминалаgksu
: подобный su
, но считывает данные аутентификации в Xrlogind
: получает вход по соединению TCP через rlogin протоколsshd
: получает вход по соединению TCP через протокол SSHlogin
, но считайте вход на X дисплеяхЭти программы работают похожими способами.
Первая часть является аутентификацией: программа читает некоторый вход от пользователя и решает, разрешен ли пользователь войти в систему. Традиционный метод состоит в том, чтобы считать имя пользователя и пароль и проверить, что пользователь упоминается в пользовательской базе данных системы и что пароль, что введенный пользователь является тем в базе данных. Но существует много других возможностей (одноразовые пароли, биометрическая аутентификация, передача авторизации, …).
После того как это было установлено, что пользователь разрешен войти в систему и в том, какая учетная запись, программа входа в систему устанавливает авторизацию пользователя, например, каким группам пользователь будет принадлежать на этой сессии.
Программа входа в систему может также проверить ограничения учетной записи. Например, это может осуществить время входа в систему или максимальное количество зарегистрированных пользователей, или отказаться от определенных пользователей на определенных соединениях.
Наконец программа входа в систему настраивает сессию пользователя. Существует несколько подшагов:
setuid
отбрасывать это наконец, что не менее важно, полномочие.login
и su
, или sshd
если никакая команда не была указана; X менеджеров по оформлению вызывают X менеджеров сеансов или менеджер окон).Большинство нельдов в наше время использует PAM (Сменные Модули аутентификации) для обеспечения универсального способа управлять услугами по входу в систему. PAM делит свою функциональность на 4 части: “автор” охватывает обе аутентификации (1 выше) и авторизация (2 выше); “учетная запись” и “сессия” как 3 и 4 выше; и существует также “пароль”, который не используется для логинов, но обновить аутентификационные маркеры (например, пароли).
Системные вызовы, которые Вы ищете, называют вещами как setuid
и seteuid
хотя существует на самом деле вся семья кромки в зависимости от точно, какие варианты пользовательских идентификационных данных Вы пытаетесь изменить.
Существуют также параллельные вызовы как setgid
для изменения группы, которую процесс выполняет как.
login
отбросит полномочия пользователя root при необходимости. Много программ, для которых нужны полномочия пользователя root только первоначально, запустят как корень, сделают то, что они должны сделать, и затем выпадающий в учетную запись обычного пользователя, таким образом, они не должны волноваться о ком-то использующем ошибку в двоичном файле для получения доступа к корневой оболочке. login
естественно содержит полномочия дольше, но принцип является тем же.
На самом деле отбрасывание полномочий пользователя root довольно тривиально. POSIX определяет setuid()
и setgid()
функции, которые изменяют Вашего пользователя и идентификаторы группы, соответственно (реальный и эффективный, если Вы запускаете как корень). login
вызовы оба из них, а также initgroups()
для установки любых дополнительных групп, Вы можете иметь (так как setgid
только для установки Вашего идентификатора основной группы),
Естественно это - ядро, которое на самом деле обрабатывает изменение UID/GID процесса. Как я могу найти реализации системных вызовов ядра Linux? объясняет много о syscalls; в моем источнике ядра я имею:
#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)
так 144 и 146 числа системного вызова для тех функций на моей машине
Я не проверял su
источник для наблюдения, что это делает, но я подозреваю это также, отбрасывает полномочия пользователя root прямо прежде exec()
луг оболочка, с помощью того же метода