Tại sao tên người dùng Linux không thể bắt đầu bằng số?


84

Có một lý do kỹ thuật tại sao? Đây có phải là một tạo tác từ những ngày đầu của Linux hoặc Unix và nếu có thì tại sao nó vẫn tồn tại?


22
Vì điều này đã được gỡ lỗi trong các câu trả lời, nguồn của bạn cho tuyên bố này là gì?
l0b0

19
@ l0b0 - mỗi trang useradd(từ shadow-utils 4.2.1) trang hướng dẫn (xem 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 - oh, và chỉ vì một bản phân phối (nổi tiếng với loại điều này) cho phép nó không có nghĩa là "nó đã được gỡ lỗi trong các câu trả lời" . Câu hỏi được gắn thẻ linux, không ubuntu. Hãy thử làm nó trên archlinux .
don_crissti

1
@don_crissti Rõ ràng nó không áp dụng cho tất cả các bản phân phối Linux, và do đó thật thú vị khi biết hạn chế đó sẽ đến từ đâu.
l0b0

5
Ngay cả Ubuntu cũng quan tâm: khi bạn cài đặt với Live CD / Ubiquity tên người dùng của bạn "Phải bắt đầu bằng một chữ cái viết thường"
43Tesseracts

Câu trả lời:


136

Một số lệnh (ví dụ chown) có thể chấp nhận tên người dùng hoặc ID người dùng số, do đó, cho phép tên người dùng toàn số sẽ phá vỡ điều đó.

Một quy tắc cho phép các tên bắt đầu bằng một số và chứa một số alpha có thể được coi là không đáng để nỗ lực; thay vào đó chỉ là một yêu cầu để bắt đầu với một ký tự alpha.

Biên tập:

Nó xuất hiện từ các phản ứng khác mà một số distro đã vượt qua giới hạn này; trong trường hợp này, theo tài liệu của GNU Core Utils :

POSIX yêu cầu các lệnh này trước tiên cố gắng giải quyết chuỗi được chỉ định dưới dạng tên và chỉ một lần thất bại, sau đó thử diễn giải nó dưới dạng ID.

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

Thêm người dùng có tên '0' sẽ chỉ yêu cầu sự cố (UID 0 == người dùng root). Tuy nhiên, lưu ý rằng các đối số ID nhóm / người dùng có thể được bắt đầu bằng dấu '+' để buộc giải thích chúng là số nguyên.


13
Đây là bài viết duy nhất thực sự trả lời câu hỏi. Bạn nên thêm một ví dụ để cho mọi người thấy rằng trên các bản phân phối linux không có thói quen cắt mã ngược dòng, kết quả của việc chạy useradd 253useradd: invalid user name '253'
don_crissti

2
Đối với bản ghi ở đây là mã nguồn nếu bạn muốn thêm nó vào bài viết của mình.
don_crissti

5
Bạn có thể tưởng tượng các cơ hội nhầm lẫn nếu tên người dùng 1000 có UID 253 không? Hoặc, nói chung, đối với tên người dùng số không khớp với UID? Simlarly với các nhóm, tất nhiên.
Jonathan Leffler

5
Tôi có một hệ thống LDAP trong đó một số người dùng có mã số nhân viên / số đăng ký (số) làm tên người dùng. Tôi nhanh chóng học cách chuẩn hóa thành ID người dùng ( chown -R $(id -u $username) ...).
muru

2
lý tưởng là một chuỗi tên người dùng, cho dù là số hoặc chữ cái, sẽ được ánh xạ tới UID và các tên luôn được tra cứu để xác định UID, trái ngược với sự lười biếng 'tên này có phải là số không? sau đó tôi sẽ coi nó như một ID '
Matt Warren

83

Đây là một thử nghiệm trên Ubuntu 14.04 bằng cách sử dụng các số:

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

và một sử dụng 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
😀

Đây có lẽ là ý tưởng tồi tệ nhất mà tôi có:

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

Rõ ràng bạn có thể thêm một người dùng như vậy, mặc dù tôi không chắc đây là một ý tưởng tốt trong thời gian dài.


1
useradd '*'sẽ rất vui - cd /home/*/sẽ không hoạt động như mong đợi và ai biết các tiện ích khác sẽ phản ứng như thế nào khi sử dụng giá trị của $HOMEngười dùng đó.
Liam Dawson

9
wow ub Ubuntu cho phép điều đó? Tôi tự hỏi điều gì xảy ra nếu bạn cố gắng useradd 1000(giả sử bạn đã có người dùng với UID 1000)
thomas_d_j

8
+1 chỉ cho tất cả các biểu tượng bị cấm!
EKons

3
Ồ, tôi có thể nghĩ tồi tệ hơn ...
OrangeDog

4
@IsmaelMiguel: Một chữ \0trong / etc / passwd có thể sẽ phá vỡ rất nhiều chương trình phân tích cú pháp. Nhưng bạn có thể không thể thêm người dùng có tên đó ngay từ đầu bằng các công cụ tiêu chuẩn. Các cuộc gọi hệ thống mkdir(2)cũng sử dụng các chuỗi có độ dài ẩn 0 kết thúc, do đó bạn không thể tạo /home/\0/, vì đường dẫn đó là chính xác /home.
Peter Cordes

9

Tên người dùng * Nix thường là một chuỗi dài 32 ký tự được tạo bởi tiện ích useradd. Như bạn đã nói, đây là kết quả trực tiếp của các tiêu chuẩn Unix (BSD về mặt kỹ thuật) ban đầu. Theo trang Man FreeBSD passwd(5):

Tên đăng nhập không được bắt đầu bằng dấu gạch nối (`- ') và không thể chứa các ký tự, tab hoặc dấu cách 8 bit hoặc bất kỳ ký hiệu nào trong số này:` ,: + & #% ^ ()! @ ~ *? <> = | / "'. Ký hiệu đô la (` $') chỉ được phép là ký tự cuối cùng được sử dụng với Samba. Không có trường nào có thể chứa dấu hai chấm (`: ') vì điều này đã được sử dụng trong lịch sử để phân tách các trường trong người dùng cơ sở dữ liệu.

Một số hệ thống * Nix được sử dụng để đưa ra các lỗi tối nghĩa khi được hiển thị với các ký tự đặc biệt trong tên người dùng, do đó, cuối cùng, các ký tự đặc biệt đã bị cấm. Trong hầu hết các hệ thống * Nix hiện đại, việc thay đổi passwd/ useraddtiện ích để hỗ trợ tên người dùng đặc biệt là tương đối dễ dàng , nhưng hầu hết mọi người đều do dự thay đổi một thứ không quan trọng như vậy, vì nó sẽ ít ảnh hưởng và gây ra sự không tương thích ngược.

EDIT:
Như Adonis đã nói, trên thực tế có thể thực hiện điều này trong một bản phân phối Linux hiện đại, tuy nhiên điều đó không được khuyến khích (đặc biệt là khi gặp các chương trình chuẩn hóa hoặc kế thừa).


5
Chắc chắn nhưng câu hỏi thậm chí không đề cập đến các ký tự đặc biệt. Nó hỏi tại sao tên người dùng không thể bắt đầu bằng chữ số (không phải là ký tự đặc biệt).
don_crissti

Chắc chắn @don_crissti, bạn có muốn tôi hỏi lại tại sao về mặt lịch sử tên người dùng không thể bắt đầu bằng một khoảng trắng, sau đó hỏi riêng tại sao nó không bắt đầu với mỗi biểu tượng, sau đó hỏi & c kết thúc theo lịch sử bằng $? "Câu trả lời" này không phù hợp như một nhận xét, mà rõ ràng là nó, nhưng chứa thông tin hữu ích liên quan đến câu hỏi.
frumbert

Ký tự 8 bit trong đoạn đó có nghĩa là gì? IE: Chắc chắn bất kỳ ký tự ascii nào là 8 bit?
Matt Warren

hỡi ôi! /etc/passwdlà một tập tin văn bản. useradd? pish-tosh. Sysadins thực sự sử dụng vi!
ngày

1
@MattWarren. ASCII là mã hóa 7 bit
fpmurphy

1

Có một lý do kỹ thuật tại sao? Đây có phải là một tạo tác từ những ngày đầu của Linux hoặc Unix và nếu có thì tại sao nó vẫn tồn tại?

Tôi không thể nghĩ ra một lý do kỹ thuật - trong lịch sử, đó chỉ là ASCII. Làm thế nào nó được đọc và sau đó gõ vào tay của lập trình viên.

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

Vì tôi đã dành thời gian duyệt các trang hướng dẫn lưu trữ (ví dụ: 1BSD là Phân phối Phần mềm Berkeley đầu tiên của Bill Joy ), tôi không thấy gì chỉ định tên người dùng. Điều đó không có nghĩa là nó không tồn tại, nhưng tôi chưa thấy nó.

Vì vậy, sau đó chúng ta còn lại với bối cảnh lịch sử của con người. Quay lại khi tôi bắt đầu công nghệ vào năm 1980, chúng tôi luôn sử dụng tên thật của mình để đăng nhập. Thường là tên đầy đủ đầu tiên và cuối cùng trừ khi có một số giới hạn chiều dài. Điều này rất quan trọng vì tên đăng nhập của bạn đã được sử dụng làm địa chỉ email của bạn. Không ai trở lại sau đó gửi email đó là ẩn danh. Tất nhiên phải có một số ngoại lệ, tôi không nhớ chúng. Nhìn chung, tôi tin rằng đây là trường hợp.

Và theo rfc5321 # page-63, không có bất kỳ hạn chế nào đối với việc "tên" email bắt đầu bằng một số. gmail sẽ tạo tất cả tên người dùng số. (lấy ngay bây giờ, họ đang đi nhanh).

Vì vậy, nếu có bất kỳ mã nào từ chối tên người dùng bắt đầu bằng [0-9], thì có lẽ nó đã xuất hiện sau đó với một số lập trình viên nghĩ rằng "tại sao bạn lại có một số làm tên?". Một lần nữa, tôi phải nói rằng rất có thể có mã unix lịch sử đã từ chối tên người dùng bắt đầu bằng một số. Tôi chỉ không nhìn thấy nó. Các bảng mật khẩu ban đầu được chỉnh sửa bằng tay, tôi chắc chắn nhớ thường xuyên làm điều đó, ngay cả trong những năm đầu thập niên 90.

Theo như lý do tại sao nó vẫn tồn tại, tôi sẽ trích dẫn stroustrup, C ++ 11FAQ, Khi nào các thư viện tiêu chuẩn mới sẽ có sẵn?

Để làm cho vấn đề trở nên khó khăn hơn, hãy nhớ rằng không thể loại bỏ các tính năng cũ hơn, ngay cả khi ủy ban đồng ý rằng chúng là xấu: kinh nghiệm cho thấy rằng người dùng buộc mọi người triển khai tiếp tục cung cấp các tính năng bị từ chối và bị cấm theo các công tắc tương thích (hoặc theo mặc định) trong nhiều thập kỷ.


0

Như đã chỉ ra trong các câu trả lời, tên người dùng Linux có thể là số. Tuy nhiên, đây là một ý tưởng tồi vì nó sẽ gây nhầm lẫn cho nhiều công cụ phần mềm (và sysadins của con người!).

Vì lý do này, ví dụ, tên người dùng và tên nhóm tất cả số không được chấp nhận trong RHEL 7 và bị cấm trong RHEL 8:

8.7.1. shadow-utilskhông còn cho phép tên người dùng và nhóm tất cả số

Các lệnh useraddgroupaddkhông cho phép tên người dùng và nhóm bao gồm hoàn toàn các ký tự số. Lý do không cho phép các tên như vậy là vì điều này có thể gây nhầm lẫn tiềm năng nhiều công cụ hoạt động với tên người dùng và nhóm và id người dùng và nhóm (là số). Xin lưu ý rằng tên người dùng và nhóm tất cả số không được chấp nhận trong Red Hat Enterprise Linux 7 và hỗ trợ của họ đã bị xóa hoàn toàn trong Red Hat Enterprise Linux 8.


-2

Tôi không chắc chắn tôi sẽ gọi nó là một lý do kỹ thuật, nhưng quy tắc rút gọn thành "tên người dùng phải là một định danh ngôn ngữ lập trình hợp lệ". Mã định danh có một số thuộc tính đẹp do cú pháp bị hạn chế của chúng: Chúng không thể bị nhầm với số, ngay cả khi đọc characte theo ký tự và chúng không cần được trích dẫn khi đi qua trình phân tích cú pháp. Nói tóm lại, chúng dễ dàng được nhận ra là tên, làm giảm công việc lập trình cần thiết để làm việc với chúng.

Tôi nghi ngờ rằng không bao giờ thực sự cần thiết phải không cho phép tên người dùng bắt đầu bằng một chữ số, nhưng "tên người dùng phải là định danh" là một quy tắc đơn giản có thể rõ ràng đối với 100% người dùng Unix đầu tiên.

Nếu nơi duy nhất bạn nhập tên người dùng của bạn là tại dấu nhắc đăng nhập trong GUI, thì có thể không có sự khác biệt nào về ký tự bao gồm (miễn trừ null và những thứ như dòng mới, sẽ cung cấp ngay cả quy trình đăng nhập cho các trục trặc). Nhưng nếu bạn thực hiện nhiều công việc từ dòng lệnh, sự tiện lợi của việc có tên người dùng dễ làm việc.


Humm, một tên đăng nhập (tên người dùng) hoàn toàn không liên quan gì đến một định danh ngôn ngữ lập trình.
fpmurphy

Tuy nhiên, định nghĩa về tên người dùng hợp lệ cũng giống như đối với định danh, đó là điểm chính.
alexis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.