Чому імена користувачів Linux не можуть починатися з цифр?


84

Чи є технічна причина, чому? Це артефакт з перших днів Linux або Unix, і якщо так, то чи існує це причина?


22
Оскільки це було розкрито у відповідях, що є вашим джерелом для цього твердження?
l0b0

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_-]*[$]?
CAVEATS

30
@ l0b0 - о, і лише тому, що один дистрибутив (відомий подібними речами) дозволяє це не означає, "він був розблокований у відповідях" . Питання позначене тегом linux, ні ubuntu. Спробуйте зробити це на archlinux .
don_crissti

1
@don_crissti Очевидно, це не стосується всіх дистрибутивів Linux, і тому було цікаво знати, звідки це обмеження береться .
l0b0

5
Навіть Ubuntu піклується: коли ви встановлюєте на Live CD / Ubiquity своє ім’я користувача "Почати слід з
малої

Відповіді:


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 user). Однак зауважте, що аргументам ідентифікаторів групи / користувачів може передувати "+", щоб примусити їх інтерпретувати як ціле число.


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
wow ubuntu це дозволяє? Цікаво, що станеться, якщо ви спробуєте useradd 1000(якщо ви вже маєте користувача з UID 1000)
thomas_d_j

8
+1 лише для всіх заборонених символів!
EKons

3
О, я можу подумати про гірше ...
OrangeDog

4
@IsmaelMiguel: Буквал \0в / etc / passwd, ймовірно, зламає багато програм, які аналізують його. Але ви, мабуть, не змогли додати користувача з цим іменем, в першу чергу, використовуючи стандартні інструменти. Системні виклики, як-от, mkdir(2)також використовують 0-кінцеві рядки неявної довжини, тому ви не можете створити /home/\0/, тому що цей шлях справедливий /home.
Пітер Кордес

9

Ім’я користувача * Nix - це, як правило, рядок довжиною 32 символи, створений утилітою useradd. Це, як ви сказали, прямий результат ранніх стандартів Unix (BSD технічно). За даними Сторінки FreeBSD Man passwd(5):

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

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

EDIT:
Як сказав Адоніс, насправді це можливо зробити в сучасному дистрибутиві Linux, однак це недоцільно (особливо при зустрічі зі стандартизованими або застарілими програмами).


5
Звичайно, але питання навіть не згадує особливих персонажів. Він запитує, чому імена користувачів не можуть починатися з цифр (які не є спеціальними символами).
don_crissti

Звичайно, @don_crissti, ви хочете, щоб я повторно запитав, чому історично ім'я користувача не може починатися з пробілу, а потім окремо запитати, чому він історично не починається з кожного символу, а потім запитувати & c історично закінчується на $? Ця "відповідь" не підходить як коментар, який, очевидно, є, але містить корисну інформацію, пов'язану з питанням.
фрумберт

Що означає 8-бітний символ у цьому абзаці? IE: Напевно, будь-які символи ascii є 8-бітовими?
Метт Уоррен

фех! /etc/passwdце текстовий файл. useradd? жалюгідний Справжні сисадміни використовують vi!
зафіксовано

1
@MattWarren. ASCII - це 7-бітове кодування
fpmurphy

1

Чи є технічна причина, чому? Це артефакт з перших днів Linux або Unix, і якщо так, то чи існує це причина?

Я не можу придумати технічну причину - історично це просто ASCII. Як читається, а потім друкується, знаходиться в руках кодера.

unix-history-repo / usr / src / cmd / 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.


-2

Я не впевнений, що я б назвав це технічною причиною, але правило зводиться до "ім'я користувача має бути дійсним ідентифікатором мови програмування". Ідентифікатори мають деякі приємні властивості через обмежений синтаксис: Вони не можуть помилитися з цифрами, навіть коли читають символи за символом, і їх не потрібно цитувати, коли проходить парсер. Коротше кажучи, їх легко розпізнати як імена, що зменшує роботу програмування, необхідну для роботи з ними.

Я сумніваюся, що коли-небудь дійсно потрібно було заборонити імена користувачів, які починаються з цифри, але "ім'я користувача має бути ідентифікатором" - це просте правило, яке було б чітко зрозумілим для 100% ранніх користувачів Unix.

Якщо єдине місце, куди ви вводите своє ім’я користувача, є в запиті для входу в графічний інтерфейс, воно, ймовірно, не має значення, які символи він включає (виключаючи нулі та такі речі, як нові рядки, що дасть би навіть процедуру входу ікоти). Але якщо ви робите багато роботи з командного рядка, зручність мати ім’я користувача, з яким легко працювати.


Humm, логін (ім'я користувача) абсолютно не має нічого спільного з ідентифікатором мови програмування.
fpmurphy

І все-таки визначення дійсного імені користувача таке саме, як і для ідентифікаторів, в цьому справа.
alexis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.