Почему имена пользователей Linux не могут начинаться с цифр?

84

Есть ли техническая причина, почему? Это артефакт с первых дней существования Linux или Unix, и если да, то есть ли причина, почему он сохраняется?

43Tesseracts
источник
22
Так как это было опровергнуто в ответах, каков ваш источник этого утверждения?
10
19
@ l0b0 - за useraddshadow-utils 4.2.1) страницы справочника (см. ПРОТЕСТИ ):Usernames must start with a lower case letter or an underscore [...] In regular expression terms: [a-z_][a-z0-9_-]*[$]?
don_crissti
30
@ l0b0 - о, и только потому, что один дистрибутив (известный такими вещами) позволяет, это не означает "он был опровергнут в ответах" . Вопрос помечен linux, а не ubuntu. Попробуйте сделать это на archlinux .
don_crissti
1
@don_crissti Это явно не относится ко всем дистрибутивам Linux, и поэтому было интересно узнать, откуда появилось это ограничение.
10
5
Даже Ubuntu заботится: когда вы устанавливаете с Live CD / Ubiquity ваше имя пользователя «Должно начинаться со строчной буквы»
43Tesseracts

Ответы:

136

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

Правило, разрешающее имена, начинающиеся с цифры и содержащие некоторую альфу, вероятно, не стоило усилий; вместо этого есть только требование начать с символа альфа.

Редактировать:

Из других ответов следует, что некоторые дистрибутивы сняли это ограничение; в этом случае, согласно документации GNU Core Utils :

POSIX требует, чтобы эти команды сначала попытались разрешить указанную строку как имя, и только после сбоя, а затем попытались интерпретировать ее как идентификатор.

$ useradd 1000   # on most systems this will fail with:
                 # useradd: invalid user name '1000'
$ mkdir /home/1000
$ chown -R 1000 /home/1000   # This will first try to map
    # to username "1000", but this may easily be misinterpreted.

Добавление пользователя с именем «0» просто вызовет проблемы (UID 0 == пользователь root). Однако обратите внимание, что аргументам идентификатора группы / пользователя может предшествовать знак «+», чтобы заставить их интерпретировать как целое число.

thomas_d_j
источник
13
Это единственный пост, который действительно отвечает на вопрос. Вы должны добавить пример , чтобы показать человек , что на Линукс дистрибутивах , которые не имеют привычки калечить вверх по течению кода результата работы useradd 253являетсяuseradd: invalid user name '253'
don_crissti
2
Для записи вот исходный код, если вы хотите добавить его в свой пост.
don_crissti
5
Можете ли вы представить себе возможность путаницы, если имя пользователя 1000 имеет UID 253? Или вообще для числовых имен пользователей, которые не совпадают с UID? Одновременно с группами, конечно.
Джонатан Леффлер
5
У меня есть система LDAP, где некоторые пользователи имеют (числовой) код сотрудника / регистрационный номер в качестве имени пользователя. Я быстро научился канонизировать с идентификаторами пользователей ( chown -R $(id -u $username) ...).
Муру
2
в идеале строка имени пользователя, будь то цифры или буквы, должна быть сопоставлена ​​с UID, и имена всегда ищутся, чтобы определить UID, в отличие от ленивого «это имя состоит из цифр? тогда я буду рассматривать это как удостоверение личности »
Мэтт Уоррен
83

Вот тест на Ubuntu 14.04 с использованием чисел:

root@ubuntu:~# useradd 232
root@ubuntu:~# mkdir /home/232
root@ubuntu:~# chown 232.232 /home/232
root@ubuntu:~# passwd 232
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@ubuntu:~# login
c2 login: 232
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 2.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.


$ 
$ whoami
232

и один с использованием Unicode U + 1F600 - 😀

root@c2:~# useradd 😀
root@c2:~# mkdir /home/😀
root@c2:~# chown 😀.😀 /home/😀
root@c2:~# passwd 😀
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@c2:~# login
c2 login: 😀
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 2.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

$ whoami
😀

Это, наверное, худшая идея, которая у меня была:

root@c2:~# useradd '&#%^()!@~*?<>=|'
root@c2:~# passwd '&#%^()!@~*?<>=|'
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@c2:~# mkdir '/home/&#%^()!@~*?<>=|'
root@c2:~# chown '&#%^()!@~*?<>=|.&#%^()!@~*?<>=|' '/home/&#%^()!@~*?<>=|'
root@c2:~# login
c2 login: &#%^()!@~*?<>=|     
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)
**** text removed ****
applicable law.

$ whoami
&#%^()!@~*?<>=|

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

Адонис
источник
1
useradd '*'было бы весело - cd /home/*/не сработало бы так, как ожидалось, и кто знает, как будут реагировать другие утилиты при использовании значения $HOMEдля этого пользователя.
Лиам Доусон
9
вау убунту это разрешает? Интересно, что случится, если вы попытаетесь useradd 1000(если у вас уже есть пользователь с UID 1000)
thomas_d_j
8
+1 только за все запрещенные символы!
EKons
3
О, я могу думать о худшем ...
OrangeDog
4
@IsmaelMiguel: Буква \0в / etc / passwd, вероятно, сломает множество программ, которые его анализируют. Но вы, вероятно, не могли бы сначала добавить пользователя с таким именем, используя стандартные инструменты. Системные вызовы вроде mkdir(2)также используют строки с неявной длиной в конце, поэтому вы не можете создавать /home/\0/, потому что этот путь - просто /home.
Питер Кордес
9

Имя пользователя * Nix обычно представляет собой строку длиной 32 символа, созданную утилитой useradd. Это, как вы сказали, прямой результат ранних стандартов Unix (технически BSD). Согласно справочной странице FreeBSD passwd(5):

Имя для входа не должно начинаться с дефиса (`- ') и не может содержать 8-битные символы, символы табуляции или пробелы или любые из следующих символов:`,: + & #% ^ ()! @ ~ *? <> = | / "'. Символ доллара (` $') разрешен только в качестве последнего символа для использования с Samba. Ни одно поле не может содержать двоеточие (`: '), поскольку это исторически использовалось для разделения полей в пользователе база данных.

В некоторых системах * Nix появлялись непонятные ошибки при отображении специальных символов в именах пользователей, поэтому в конечном итоге специальные символы были запрещены. В большинстве современных систем * Nix было бы относительно легко изменить утилиты passwd/ useraddдля поддержки имен пользователей специальных символов, но большинство людей не решаются изменить такую ​​неважную вещь, так как это будет иметь небольшой эффект и приведет к обратной несовместимости.

РЕДАКТИРОВАТЬ:
Как сказал Адонис, на самом деле это возможно сделать в современном дистрибутиве Linux, однако это не рекомендуется (особенно когда сталкиваются со стандартными или устаревшими программами).

Интересно...
источник
5
Конечно, но в вопросе даже не упоминаются специальные символы. Он спрашивает, почему имена пользователей не могут начинаться с цифр (которые не являются специальными символами).
don_crissti
Конечно, @don_crissti, вы бы предпочли, чтобы я повторно спросил, почему исторически имя пользователя не может начинаться с пробела, а затем спросите отдельно, почему оно исторически не начинается с каждого из символов, а затем спросите & c исторически оканчивается на $? Этот «ответ» не подходит как комментарий, которым он явно является, но содержит полезную информацию, связанную с вопросом.
frumbert
Что подразумевается под 8-битным символом в этом абзаце? IE: Конечно, любые символы ASCII 8-битные?
Мэтт Уоррен
Фэ! /etc/passwdтекстовый файл useradd? тьфу-Тош. Настоящие сисадмины используют vi!
добавлено
1
@MattWarren. ASCII представляет собой 7-битную кодировку
fpmurphy
1

Есть ли техническая причина, почему? Это артефакт с первых дней существования Linux или Unix, и если да, то есть ли причина, почему он сохраняется?

Я не могу придумать техническую причину - исторически это просто ASCII. Как он читается, а затем печатается, находится в руках кодера.

Unix-история-репо / USR / SRC / ЦМД / passwd.c

char *uname;

insist = 0;
if(argc < 2) {
    if ((uname = getlogin()) == NULL) {
        printf ("Usage: passwd user\n");
        goto bex;
    } else {
        printf("Changing password for %s\n", uname);
    }
} else {
    uname = argv[1];
}

Так как я провел некоторое время, просматривая страницы справочника архива (например, 1BSD был первым дистрибутивом программного обеспечения Беркли Билла Джоя ), я не видел ничего, что определяло бы имена пользователей. Это не значит, что его не существует, но я его не видел.

Итак, мы остаемся с историческим человеческим контекстом. Когда я начал заниматься технологиями в 1980 году, мы всегда использовали наше настоящее имя для входа в систему. Обычно имя, фамилия и имя, если не было ограничения по длине. Это было важно, так как ваше имя пользователя использовалось в качестве вашего адреса электронной почты. Тогда никто не отправлял письмо, которое было анонимным. Конечно, были некоторые исключения, я их не помню. В целом, хотя, я считаю, что это так.

И согласно rfc5321 # page-63, нет никаких ограничений на то, чтобы «имя» электронной почты начиналось с цифры. Gmail создаст все числовые имена пользователей. (получите это, они идут быстро).

Поэтому, если есть какой-либо код, который отклоняет имя пользователя, начинающееся с [0-9], то, вероятно, он появился позже, когда какой-то программист подумал: «Почему у вас есть число в качестве имени?». Еще раз, я должен сказать, что вполне может существовать исторический код Unix, который отклонял имя пользователя, начинающееся с цифры. Я просто не видел этого. Ранние таблицы паролей были отредактированы вручную, я, конечно, помню, как часто делал это, даже в начале 90-х годов.

Что касается того, почему он сохраняется, я процитирую stroustrup, C ++ 11FAQ, когда будут доступны новые стандартные библиотеки?

Чтобы сделать проблему более сложной, помните, что невозможно исключить более старые функции, даже если комитет согласен с тем, что они плохие: опыт показывает, что пользователи заставляют каждого разработчика предоставлять устаревшие и запрещенные функции с помощью переключателей совместимости (или по умолчанию) на протяжении десятилетий.

Джим
источник
0

Как указано в ответах, имена пользователей Linux могут быть полностью числовыми. Тем не менее, это плохая идея, так как это может сбить с толку многие программные инструменты (и системные администраторы!).

По этой причине, например, полностью числовые имена пользователей и имена групп не рекомендуются в RHEL 7 и запрещены в RHEL 8:

8.7.1. shadow-utilsбольше не разрешать полностью числовые имена пользователей и групп

useraddИ groupaddкоманда запретить имена пользователей и групп , состоящие исключительно из цифр. Причина, по которой такие имена запрещены, заключается в том, что это может привести к путанице во многих инструментах, работающих с именами пользователей и групп, а также идентификаторами пользователей и групп (которые являются числами). Обратите внимание, что в Red Hat Enterprise Linux 7 полностью числовые имена пользователей и групп устарели, а их поддержка полностью исключена в Red Hat Enterprise Linux 8.

dr01
источник
-2

Я не уверен, что назвал бы это технической причиной, но правило сводится к тому, что «имя пользователя должно быть допустимым идентификатором языка программирования». Идентификаторы имеют некоторые приятные свойства из-за их ограниченного синтаксиса: их нельзя принять за числа, даже когда они читают символ за символом, и их не нужно заключать в кавычки при прохождении через анализатор. Короче говоря, они легко распознаются как имена, что сокращает объем работы, необходимой для работы с ними.

Я сомневаюсь, что когда-либо было действительно необходимо запретить имена пользователей, начинающиеся с цифры, но «имя пользователя должно быть идентификатором» - это простое правило, которое было бы совершенно ясно для 100% ранних пользователей Unix.

Если единственное место, где вы вводите свое имя пользователя, находится в приглашении для входа в GUI, то, вероятно, не имеет значения, какие символы оно содержит (исключая нули и такие вещи, как переводы строк, что может привести к сбоям даже в процедуре входа в систему). Но если вы делаете много работы из командной строки, удобство использования имени пользователя, с которым легко работать.

Alexis
источник
Хм, логин (имя пользователя) не имеет абсолютно никакого отношения к идентификатору языка программирования.
fpmurphy
И все же определение действительного имени пользователя такое же, как и для идентификаторов, в этом суть.
Алексис