Вот по крайней мере один переносимый метод Posix, который полагается только на встроенные модули оболочки (за возможным исключением printf), (Posix) нарезку параметров и пытается зацикливаться как можно меньше:
lowerunder() { local c="${1%[A-Z ]*}"
set -- "$1" "$c" "${1#"$c"}"
[ -z "$3" ] && printf %s "$1" || {
c="${3%"${3#?}"}"
[ -z "${c#[ ]}" ] && c=_
[ -z "${c#[A-Z]}" ] && {
c="$(printf %x "'$c")";
c="$(printf %b "\x$((c+20))")" ; }
lowerunder "${2}${c}${3#?}"
} ; }
Подайте ему один аргумент, заключенный в кавычки, и он заменит пробелы внутри и все прописные символы на строчные.
Подайте ему два или более, и он все равно вернет ваш первый аргумент, преобразованный в нижний регистр, а пробелы - в подчеркивания. Это не так уж много.
Признаюсь, я не силен в шестнадцатеричной математике, и это может быть слабым местом здесь - я использую printf для преобразования из кода символов Ascii в шестнадцатеричное значение в десятичное и обратно. Тем не менее, писать было весело.
Согласноpasswd(5)
руководству , имя пользователя, начинающееся с символа, отличного от буквенного, должно генерировать предупреждение (предположительно при доступе к passwd
базе данных ).
Возможно, ваш администратор полагается на тот факт, что записи для пользователей, которым не должно быть разрешено входить в систему, просто искажены(обратите внимание, что нет возможности закомментировать строки в файле passwd
).
Я бы предложил, чтобы вместо того, чтобы полагаться на искаженные записи, пользователи, которым не должно быть разрешено входить в систему, должным образом ограничивались с помощью passwd -N username
вместо (, см. passwd(1)
), или с помощью какой-либо подобной механики. Или, возможно, просто удалены, если пользователи не должны существовать в системе.
На справочной странице Solaris 11 passwd
указано:
username
is the user's login name.
The login (login) and role (role) fields accept a string of no more than eight bytes consisting of characters from the set of alphabetic characters, numeric characters, period (.), underscore (_), and hyphen (-). The first character should be alphabetic and the field should contain at least one lower case alphabetic character. A warning message is displayed if these restrictions are not met.
Обратите внимание, что там нет документации, утверждающей, что имя пользователя, начинающееся с #
, не будет разрешено для входа в систему.
Полагаться на то, что таким учетным записям не разрешено входить в систему, при отсутствии документации, подтверждающей такое поведение, в таком -контексте, связанном с безопасностью, я бы не назвал поведением компетентного системного администратора.
Ваш системный администратор надеется , что такое поведение сохранится и в будущем. Надежда — ужасно низкий стандарт для наложения ограничений безопасности.
… но не в Illumos, OpenBSD или Linux; и только в исходной форме . Люди, пишущие на WWW-сайте Gentoo Linux, не имели опыта работы с достаточно широким спектром операционных систем.
Формат файла отличается во всех операционных системах. FreeBSD, читая файл /etc/master.passwd
, допускает строчные комментарии. Парсеры Linux, OpenBSD и Illumos для их файлов /etc/passwd
или /etc/master.passwd
этого не делают.
Как видите, первые несколько строк начального файла FreeBSD /etc/master.passwd
являются строками комментариев, которые явно игнорируются программой FreeBSD pw_mkdb
. В OpenBSD pw_mkdb
этого нет, а в стандартном /etc/master.passwd
нет комментариев.
Конечно, после того как программа pw_mkdb
скомпилировала исходный код в реальную базу данных, используемую библиотечными подпрограммами, выполняющими поиск в базе данных системных учетных записей, комментарии были отфильтрованы. Фактический скомпилированный формат базы данных — Berkeley DB,который не имеет комментариев.
Подсистема базы данных учетных записей пользователей Linux не использует скомпилированные файлы базы данных с индексами, в отличие от BSD. Однако подпрограммы библиотеки поиска, анализирующие исходные плоские таблицы, не допускают комментариев. То же самое верно для Illumos и для OpenSolaris до него.
POSIX указывает, что переносимое имя учетной записи может содержать только символы из так называемого -набора символов переносимого имени файла с дополнительным ограничением на первый символ имени. Этот набор не содержит символа #
.
Дополнительное ограничение на первый символ важно, потому что оно затрагивает причины, по которым #
вызовет проблемы с именами учетных записей. Имена учетных записей используются в качестве аргументов для программ, а аргументы, начинающиеся с -
, обычно обозначают аргументы опции . (Да, существуют способы избежать использования имен учетных записей в качестве аргументов параметров, но они не являются универсальными и не стандартизированными.)
В этом суть проблемы. Хотя фактическая исходная форма самой таблицы допускает любой символ, кроме разделителя полей (␊
), разделителя записей(:
)или (во FreeBSD ), конец -из -ввод строки комментария(#
)в первом поле записи, использование имен учетных записей в большом количестве других контекстов накладывает на них гораздо больше ограничений:
␀
-, поэтому они не могут содержать символ ␀
. getty
программ в login
в старых операционных системах -. (Illumos входит в семейство Unices, которое избавилось от программы getty
еще в 1988 году , разумеется.)Это исключает символ ␀
и инициал -
. /etc/rc.conf
до /etc/sysconfig/wibble
, поэтому метасимволы оболочки, которые нарушили бы такие сценарии, не используются. Таким образом, #
, будучи метасимволом оболочки, не используется. ␀
и =
(, вызывающие неоднозначность при синтаксическом анализе среды процесса ), не используются. =
, #
и ;
, не используются. Таким образом, хотя использование #
не комментирует вещи в файле паролей на Illumos, его использование вызовет немало проблем в другом месте .
… соглашение FreeBSD о начальном _
, что-то вроде соглашения Debian о префиксе Debian-
или соглашение Дэниела Дж. Бернштейна о начальном верхнем регистре G
.
… правильное поле записи в первую очередь! Это не поле имени. Это поле пароля, которое в Illumos содержит специальные значения для заблокированных учетных записей и без -учетных записей .