Dlaczego nazwy użytkowników Linuksa nie mogą zaczynać się cyframi?

84

Czy istnieje techniczny powód? Czy jest to artefakt z początków Linuksa lub Uniksa, a jeśli tak, to czy istnieje powód, dla którego trwa?

43 Teserakty
źródło
22
Skoro to zostało podważone w odpowiedziach, jakie jest twoje źródło tego oświadczenia?
l0b0
19
@ l0b0 - na useradd(z shadow-utils 4.2.1) strony podręcznika (patrz CAVEATS ):Usernames must start with a lower case letter or an underscore [...] In regular expression terms: [a-z_][a-z0-9_-]*[$]?
don_crissti
30
@ l0b0 - och, i tylko dlatego, że jedna dystrybucja (znana z tego rodzaju rzeczy) pozwala, nie oznacza to, że „została obalona w odpowiedziach” . Pytanie jest oznaczone linux, a nie ubuntu. Spróbuj to zrobić na archlinux .
don_crissti
1
@don_crissti To oczywiście nie dotyczy wszystkich dystrybucji Linuksa, dlatego ciekawie było wiedzieć, skąd to ograniczenie.
l0b0
5
Nawet Ubuntu dba o to: kiedy instalujesz z Live CD / Ubiquity, twoja nazwa użytkownika „Musi zaczynać się małą literą”
43Tesseracts

Odpowiedzi:

136

Niektóre polecenia (np. chown) Mogą akceptować nazwę użytkownika lub numeryczny identyfikator użytkownika, więc zezwolenie na użycie liczbowych nazw użytkowników mogłoby to przerwać.

Reguła zezwalająca na nazwy rozpoczynające się od liczby i zawierającej część alfa prawdopodobnie została uznana za niewartą wysiłku; zamiast tego istnieje tylko wymóg, aby zacząć od znaku alfa.

Edytować:

Z innych odpowiedzi wynika, że ​​niektóre dystrybucje obaliły to ograniczenie; w tym przypadku, zgodnie z dokumentacją GNU Core Utils :

POSIX wymaga, aby te komendy najpierw próbowały rozpoznać określony ciąg jako nazwę, a tylko raz, gdy to się nie powiedzie, a następnie spróbować zinterpretować go jako identyfikator.

$ 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.

Dodanie użytkownika o nazwie „0” oznaczałoby tylko problem (UID 0 == użytkownik root). Zauważ jednak, że argumenty grupy / ID użytkownika mogą być poprzedzone znakiem „+”, aby wymusić ich interpretację jako liczbę całkowitą.

thomas_d_j
źródło
13
To jedyny post, który faktycznie odpowiada na pytanie. Powinieneś dodać przykład, aby pokazać ludziom, że na dystrybucjach linuksowych, którzy nie mają zwyczaju okaleczać kodu źródłowego, wynikiem działania useradd 253jestuseradd: invalid user name '253'
don_crissti
2
Do rekordu tutaj jest kod źródłowy, jeśli chcesz dodać go do swojego postu.
don_crissti
5
Czy możesz sobie wyobrazić możliwości pomyłki, jeśli nazwa użytkownika 1000 ma UID 253? Czy ogólnie dla numerycznych nazw użytkowników, które nie pasują do UID? Oczywiście z grupami.
Jonathan Leffler
5
Mam system LDAP, w którym niektórzy użytkownicy mają (numeryczny) kod pracownika / numer rejestracyjny jako nazwę użytkownika. Szybko nauczyłem się kanonalizować do identyfikatorów użytkowników ( chown -R $(id -u $username) ...).
muru
2
idealnie ciąg nazwy użytkownika, zarówno cyfry, jak i litery, byłby odwzorowany na UID, a nazwy zawsze były wyszukiwane w celu ustalenia UID, w przeciwieństwie do leniwych „czy ta nazwa składa się z liczb? wtedy potraktuję to jako dowód osobisty ”
Matt Warren
83

oto test na Ubuntu 14.04 przy użyciu liczb:

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

i jeden wykorzystujący 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
😀

To chyba najgorszy pomysł, jaki miałem:

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
&#%^()!@~*?<>=|

Oczywiście możesz dodać takiego użytkownika, chociaż nie jestem pewien, czy jest to dobry pomysł na dłuższą metę.

Adonis
źródło
1
useradd '*'byłoby fajnie - cd /home/*/nie działałoby zgodnie z oczekiwaniami, a kto wie, jak zareagowałyby inne narzędzia, gdy użyłby wartości $HOMEdla tego użytkownika.
Liam Dawson
9
wow ubuntu na to pozwala? Zastanawiam się, co się stanie, jeśli spróbujesz useradd 1000(zakładając, że masz już użytkownika z UID 1000)
thomas_d_j
8
+1 za wszystkie zabronione symbole!
EKons,
3
Och, mogę myśleć o gorszym ...
OrangeDog
4
@ IsmaelMiguel: Dosłowność \0w / etc / passwd prawdopodobnie zepsułaby wiele programów, które go analizują. Ale prawdopodobnie nie można było dodać użytkownika o tej nazwie, używając standardowych narzędzi. Wywołania systemowe, takie jak, mkdir(2)również używają zakończonych zerami ciągów o niejawnej długości, więc nie można tworzyć /home/\0/, ponieważ ta ścieżka jest po prostu /home.
Peter Cordes,
9

Nazwa użytkownika * Nix to zazwyczaj ciąg znaków o długości 32 znaków utworzony przez narzędzie useradd. Jest to, jak powiedziałeś, bezpośredni wynik wczesnych standardów uniksowych (technicznie BSD). Według strony podręcznika FreeBSD passwd(5):

Nazwa logowania nie może zaczynać się od myślnika (`- ') i nie może zawierać 8-bitowych znaków, tabulatorów lub spacji ani żadnego z tych symboli:`,: + & #% ^ ()! @ ~ *? <> = | / "'. Symbol dolara (` $') jest dozwolony tylko jako ostatni znak do użycia z Sambą. Żadne pole nie może zawierać dwukropka (`: '), ponieważ historycznie używano go do oddzielania pól w użytkowniku Baza danych.

Niektóre systemy * Nix generowały niejasne błędy, gdy zostały przedstawione ze znakami specjalnymi w nazwach użytkowników, więc ostatecznie znaki specjalne zostały zbanowane. W większości współczesnych systemów * Nix zmiana passwd/ useraddnarzędzi do obsługi nazw użytkowników znaków specjalnych byłaby stosunkowo łatwa , ale większość ludzi waha się przed zmianą tak nieistotnej rzeczy, ponieważ miałoby to niewielki efekt i spowodowałoby wsteczną niezgodność.

EDYCJA:
Jak powiedział Adonis, w rzeczywistości jest to możliwe w nowoczesnej dystrybucji Linuksa, jednak nie jest to zalecane (szczególnie w przypadku programów znormalizowanych lub starszych).

Ciekawy...
źródło
5
Jasne, ale pytanie nie wspomina nawet o znakach specjalnych. Pyta, dlaczego nazwy użytkowników nie mogą zaczynać się cyframi (które nie są znakami specjalnymi).
don_crissti
Pewnie @don_crissti, czy wolałbyś, żebym ponownie zapytał, dlaczego historycznie nazwa użytkownika nie może zaczynać się od spacji, a następnie pyta osobno, dlaczego historycznie nie zaczyna się od każdego z symboli, a następnie pyta & c historycznie kończy się na $? Ta „odpowiedź” nie pasuje jako komentarz, którym jest wyraźnie, ale zawiera przydatne informacje związane z pytaniem.
frumbert
Co oznacza 8-bitowy znak w tym akapicie? IE: Z pewnością jakieś znaki ascii są 8-bitowe?
Matt Warren
feh! /etc/passwdto plik tekstowy. useradd? pish-tosh. Używaj prawdziwych administratorów vi!
naprawiono
1
@MattWarren. ASCII to 7-bitowe kodowanie
fpmurphy
1

Czy istnieje techniczny powód? Czy jest to artefakt z początków Linuksa lub Uniksa, a jeśli tak, to czy istnieje powód, dla którego trwa?

Nie mogę wymyślić przyczyny technicznej - historycznie to tylko ASCII. Sposób wczytywania, a następnie wpisywania jest w rękach programisty.

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];
}

Ponieważ spędziłem trochę czasu na przeglądaniu archiwalnych stron man (na przykład: 1BSD było pierwszą dystrybucją oprogramowania Berkeley Software Billa Joya ), nie widziałem nic, co określałoby nazwy użytkowników. Nie oznacza to, że nie istnieje, ale go nie widziałem.

Pozostaje nam zatem historyczny kontekst ludzki. Kiedy zaczynałem w technice w 1980 roku, zawsze używaliśmy naszego prawdziwego nazwiska do logowania. Zwykle pierwsze pełne i ostatnie imię i nazwisko, chyba że istnieje pewien limit długości. Było to ważne, ponieważ nazwa logowania została użyta jako adres e-mail. Wtedy nikt nie wysłał anonimowego e-maila. Oczywiście muszą być wyjątki, nie pamiętam ich. Ogólnie jednak uważam, że tak jest.

I zgodnie z rfc5321 # page-63, nie ma żadnych ograniczeń, aby „nazwa” e-maila zaczynała się od cyfry. gmail utworzy wszystkie numeryczne nazwy użytkowników. (zdobądź to teraz, idą szybko).

Więc jeśli istnieje kod, który odrzuca nazwę użytkownika rozpoczynającą się od [0-9], to prawdopodobnie powstał później z pewnym programistą, który zastanawia się „dlaczego miałbyś mieć liczbę jako nazwę?”. Jeszcze raz muszę powiedzieć, że równie dobrze może istnieć historyczny kod uniksowy, który odrzuca nazwę użytkownika zaczynającą się od cyfry. Po prostu tego nie widziałem. Wczesne tabele haseł były ręcznie edytowane, z pewnością pamiętam, że często to robiłem, nawet na początku lat 90.

Jeśli chodzi o to, dlaczego się utrzymuje, zacytuję stroustrup, C ++ 11FAQ. Kiedy będą dostępne nowe standardowe biblioteki?

Aby utrudnić problem, pamiętaj, że wyeliminowanie starszych funkcji nie jest wykonalne, nawet jeśli komitet zgodzi się, że są one złe: doświadczenie pokazuje, że użytkownicy zmuszają każdego implementatora do udostępniania przestarzałych i zbanowanych funkcji pod przełącznikami zgodności (lub domyślnie) przez dekady.

Jim
źródło
0

Jak wskazano w odpowiedziach, nazwy użytkowników systemu Linux mogą zawierać wszystkie cyfry. Jest to jednak zły pomysł, ponieważ dezorientowałby wiele narzędzi programowych (i ludzkich administratorów!).

Z tego powodu na przykład wszystkie numeryczne nazwy użytkowników i nazwy grup są przestarzałe w RHEL 7 i zabronione w RHEL 8:

8.7.1. shadow-utilsnie zezwalają już na numeryczne nazwy użytkowników i grup

useraddI groupaddpolecenia zabronić nazw użytkowników i grup składających się wyłącznie z cyfr. Powodem niedopuszczenia takich nazw jest to, że może to pomylić potencjalnie wiele narzędzi, które działają z nazwami użytkowników i grup oraz identyfikatorami użytkowników i grup (które są liczbami). Należy pamiętać, że wszystkie numeryczne nazwy użytkowników i grup są przestarzałe w Red Hat Enterprise Linux 7, a ich obsługa jest całkowicie usunięta w Red Hat Enterprise Linux 8.

dr01
źródło
-2

Nie jestem pewien, czy nazwałbym to powodem technicznym, ale reguła sprowadza się do „nazwa użytkownika musi być poprawnym identyfikatorem języka programowania”. Identyfikatory mają pewne miłe właściwości ze względu na ich ograniczoną składnię: nie można ich pomylić z liczbami, nawet podczas odczytywania znaków po znaku, i nie trzeba ich cytować podczas przeglądania parsera. Krótko mówiąc, są one łatwo rozpoznawalne jako nazwy, co zmniejsza nakład pracy programistycznej niezbędny do pracy z nimi.

Wątpię, czy kiedykolwiek naprawdę konieczne było zabronienie nazwom rozpoczynającym się cyfrą, ale „nazwa użytkownika musi być identyfikatorem” to prosta zasada, która byłaby krystalicznie czysta dla 100% wczesnych użytkowników Uniksa.

Jeśli jedynym miejscem, w którym wpisujesz swoją nazwę użytkownika, jest monit o zalogowanie się w interfejsie GUI, prawdopodobnie nie ma znaczenia, jakie znaki zawiera (wyłączając wartości null i takie rzeczy jak znaki nowej linii, co dałoby cześć nawet procedurze logowania). Ale jeśli wykonujesz dużo pracy z wiersza polecenia, wygodę posiadania łatwej w obsłudze nazwy użytkownika.

Alexis
źródło
Humm, login (nazwa użytkownika) nie ma absolutnie nic wspólnego z identyfikatorem języka programowania.
fpmurphy
A jednak definicja prawidłowej nazwy użytkownika jest taka sama jak dla identyfikatorów, o to właśnie chodzi.
Alexis