ทำไมชื่อผู้ใช้ Linux ไม่สามารถขึ้นต้นด้วยตัวเลขได้?


84

มีเหตุผลทางเทคนิคหรือไม่ สิ่งนี้เป็นสิ่งประดิษฐ์จากยุคแรก ๆ ของ Linux หรือ Unix หรือไม่และถ้าเป็นเช่นนั้นมีเหตุผลทำไมมันยังคงอยู่?


22
เนื่องจากสิ่งนี้ถูก debunked ในคำตอบแหล่งที่มาของคุณสำหรับคำสั่งนี้คืออะไร?
l0b0

19
@ l0b0 - ต่อuseradd(จากshadow-utils 4.2.1) หน้าคู่มือ (ดู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 - โอ้และเพียงเพราะหนึ่ง distro (ที่มีชื่อเสียงสำหรับชนิดของสิ่งนี้) ช่วยให้มันไม่ได้หมายความว่า"มันก็ debunked ในคำตอบ" คำถามคือแท็กไม่ได้linux ubuntuลองทำมันArchLinux
don_crissti

1
@don_crissti เห็นได้ชัดว่ามันใช้ไม่ได้กับLinux distros ทั้งหมดและดังนั้นจึงเป็นเรื่องที่น่าสนใจที่จะทราบว่าข้อ จำกัด นั้นมาจากไหน
l0b0

5
แม้ Ubuntu จะใส่ใจ: เมื่อคุณติดตั้งด้วย Live CD / Ubiquity ชื่อผู้ใช้ของคุณ "ต้องเริ่มต้นด้วยอักษรตัวพิมพ์เล็ก"
43Tesseracts

คำตอบ:


136

บางคำสั่ง (เช่นchown) สามารถยอมรับชื่อผู้ใช้หรือ ID ผู้ใช้ที่เป็นตัวเลขดังนั้นการอนุญาตให้ชื่อผู้ใช้ที่เป็นตัวเลขทั้งหมดจะทำให้แตก

กฎที่อนุญาตให้ใช้ชื่อที่ขึ้นต้นด้วยตัวเลขและมีตัวอักษรบางตัวอาจถือว่าไม่คุ้มกับความพยายาม แต่มีความต้องการที่จะเริ่มต้นด้วยตัวอักษร

แก้ไข:

มันปรากฏขึ้นจากคำตอบอื่น ๆ ที่ distro บางแห่งได้ จำกัด ข้อ จำกัด นี้; ในกรณีนี้ตามเอกสารประกอบหลักของ GNU Core :

POSIX ต้องการให้คำสั่งเหล่านี้พยายามแก้ไขสตริงที่ระบุเป็นชื่อเป็นครั้งแรกและล้มเหลวเพียงครั้งเดียวจากนั้นลองตีความมันเป็น 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.

การเพิ่มผู้ใช้ชื่อ '0' จะเป็นการถามปัญหา (UID 0 == ผู้ใช้รูท) อย่างไรก็ตามโปรดทราบว่าอาร์กิวเมนต์กลุ่ม / รหัสผู้ใช้สามารถนำหน้าด้วย '+' เพื่อบังคับให้การตีความเป็นจำนวนเต็ม


13
นี่เป็นโพสต์เดียวที่ตอบคำถามได้จริง คุณควรเพิ่มตัวอย่างเพื่อแสดงให้คนอื่นเห็นว่าในลินุกซ์ distros ที่ไม่มีนิสัยในการทำลายรหัสต้นน้ำผลลัพธ์ของการทำงานuseradd 253คือuseradd: invalid user name '253'
don_crissti

2
สำหรับบันทึกที่นี่เป็นรหัสที่มาหากคุณต้องการเพิ่มลงในโพสต์ของคุณ
don_crissti

5
คุณจินตนาการถึงโอกาสที่จะเกิดความสับสนได้ไหมถ้าชื่อผู้ใช้ 1,000 มี UID 253 หรือโดยทั่วไปแล้วสำหรับชื่อผู้ใช้ที่เป็นตัวเลขที่ไม่ตรงกับ UID แน่นอนกับกลุ่มแน่นอน
Jonathan Leffler

5
ฉันมีระบบ LDAP ที่ผู้ใช้บางคนมีรหัสพนักงาน / ตัวเลขลงทะเบียนเป็นชื่อผู้ใช้ ฉันเรียนรู้การตั้งรหัสผู้ใช้ ( chown -R $(id -u $username) ...) ให้เป็นมาตรฐานอย่างรวดเร็ว
muru

2
ในอุดมคติสตริงชื่อผู้ใช้ไม่ว่าจะเป็นตัวเลขหรือตัวอักษรจะถูกจับคู่กับ UID และชื่อจะค้นหาเพื่อกำหนด UID เสมอเมื่อเทียบกับความขี้เกียจ 'ชื่อนี้ทำขึ้นจากตัวเลขหรือไม่? จากนั้นฉันจะถือว่าเป็น ID '
Matt Warren

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ผู้ใช้นั้น
Liam Dawson

9
อูบุนตูว้าวอนุญาตอย่างไร? ฉันสงสัยว่าจะเกิดอะไรขึ้นถ้าคุณพยายามuseradd 1000(สมมติว่าคุณมีผู้ใช้ที่มี UID 1,000 แล้ว)
thomas_d_j

8
+1 สำหรับสัญลักษณ์ต้องห้ามทั้งหมดเท่านั้น!
EKons

3
โอ้ฉันสามารถคิดได้แย่กว่านี้ ...
OrangeDog

4
@IsmaelMiguel: ตัวอักษร\0ใน / etc / passwd อาจจะแบ่งโปรแกรมจำนวนมากที่แยกมัน แต่คุณอาจไม่สามารถเพิ่มผู้ใช้ด้วยชื่อนั้นในตอนแรกโดยใช้เครื่องมือมาตรฐาน ระบบเรียกเหมือนmkdir(2)ยังใช้ 0 สิ้นสุดสตริงที่มีความยาวโดยปริยายดังนั้นคุณจึงไม่สามารถสร้างเพราะเส้นทางที่เป็นเพียง/home/\0/ /home
Peter Cordes

9

ชื่อผู้ใช้ * ห้ามโดยทั่วไปเป็น 32 useraddตัวละครสายยาวที่สร้างขึ้นโดยยูทิลิตี้ นี่คือที่คุณกล่าวว่าเป็นผลโดยตรงของมาตรฐาน Unix ต้น (BSD ทางเทคนิค) ตามหน้า FreeBSD Man passwd(5):

ชื่อล็อกอินจะต้องไม่ขึ้นต้นด้วยเครื่องหมายขีดคั่น (`- ') และต้องไม่มีอักขระ 8 บิตแท็บหรือช่องว่างหรือสัญลักษณ์ใด ๆ เหล่านี้:`,: + & #% ^ ()! @ ~ *? <> = | / "'. สัญลักษณ์ดอลลาร์ (` $') ได้รับอนุญาตให้ใช้เป็นอักขระตัวสุดท้ายสำหรับใช้กับ Samba เท่านั้นไม่มีเขตข้อมูลใดที่อาจมีเครื่องหมายโคลอน (`: ') เนื่องจากมีการใช้ในอดีตเพื่อแยกฟิลด์ในผู้ใช้ ฐานข้อมูล

ระบบ * ห้ามใช้เพื่อโยนข้อผิดพลาดที่คลุมเครือเมื่อแสดงด้วยอักขระพิเศษในชื่อผู้ใช้ดังนั้นในที่สุดจึงห้ามใช้อักขระพิเศษ ในระบบ * ที่ทันสมัยส่วนใหญ่มันจะค่อนข้างง่ายที่จะเปลี่ยนpasswd/ useraddยูทิลิตี้เพื่อสนับสนุนชื่อผู้ใช้อักขระพิเศษ แต่คนส่วนใหญ่ลังเลที่จะเปลี่ยนสิ่งที่ไม่สำคัญเพราะมันจะมีผลเพียงเล็กน้อยและจะทำให้เกิดความไม่ลงรอยกันย้อนหลัง

แก้ไข: ดัง
ที่ Adonis กล่าวในความเป็นจริงเป็นไปได้ที่จะทำเช่นนี้ในการกระจาย Linux ที่ทันสมัยอย่างไรก็ตามมันไม่สมควร


5
แน่นอน แต่คำถามไม่ได้พูดถึงตัวละครพิเศษ มันถามว่าทำไมชื่อผู้ใช้ไม่สามารถเริ่มต้นด้วยตัวเลข (ซึ่งไม่ใช่ตัวอักษรพิเศษ)
don_crissti

แน่นอนว่า @don_crissti คุณต้องการให้ฉันถามอีกครั้งว่าทำไมชื่อผู้ใช้ในอดีตไม่สามารถเริ่มต้นด้วยช่องว่างได้แล้วถามแยกกันว่าทำไมประวัติศาสตร์ถึงไม่เริ่มต้นด้วยสัญลักษณ์แต่ละตัวแล้วถาม & c ลงท้ายด้วย $ "คำตอบ" นี้ไม่พอดีกับความคิดเห็นซึ่งชัดเจนคือยังมีข้อมูลที่เป็นประโยชน์ที่เกี่ยวข้องกับคำถาม
frumbert

อักขระ 8 บิตในวรรคนั้นมีความหมายอย่างไร IE: แน่นอนว่า ascii chars จะเป็น 8-bit?
Matt Warren

feh! /etc/passwdเป็นไฟล์ข้อความ useradd? pish-tosh ดูแลระบบที่แท้จริงใช้vi!
ตรึง

1
@MattWarren ASCII เป็นการเข้ารหัสแบบ 7 บิต
fpmurphy

1

มีเหตุผลทางเทคนิคหรือไม่ สิ่งนี้เป็นสิ่งประดิษฐ์จากยุคแรก ๆ ของ Linux หรือ Unix หรือไม่และถ้าเป็นเช่นนั้นมีเหตุผลทำไมมันยังคงอยู่?

ฉันไม่สามารถคิดถึงเหตุผลทางเทคนิค - ในอดีตเป็นเพียง ASCII วิธีการอ่านและพิมพ์ลงในมือของ coder

ยูนิกซ์ประวัติศาสตร์ 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 เป็น Berkeley Software Distribution รายแรกของ Bill Joy ) ฉันไม่เห็นอะไรเลยที่ระบุชื่อผู้ใช้ ไม่ใช่เพื่อบอกว่ามันไม่มีอยู่จริง แต่ฉันไม่ได้เห็นมัน

ดังนั้นเราจึงเหลือบริบททางประวัติศาสตร์ของมนุษย์ ย้อนกลับไปเมื่อฉันเริ่มใช้เทคโนโลยีในปี 1980 เรามักจะใช้ชื่อจริงของเราในการเข้าสู่ระบบ โดยทั่วไปชื่อแรกและนามสกุลเต็มเว้นแต่จะมีการจำกัดความยาว สิ่งนี้สำคัญเนื่องจากชื่อล็อกอินของคุณถูกใช้เป็นที่อยู่อีเมลของคุณ ไม่มีใครกลับมาแล้วส่งอีเมลที่ไม่ระบุชื่อ แน่นอนว่าต้องมีข้อยกเว้นบางอย่างฉันจำไม่ได้ โดยรวมแล้วฉันเชื่อว่านี่เป็นกรณี

และตาม rfc5321 # หน้า -63 ไม่มีข้อ จำกัด ใด ๆ ในการมีอีเมล "ชื่อ" เริ่มต้นด้วยตัวเลข gmail จะสร้างชื่อผู้ใช้ที่เป็นตัวเลขทั้งหมด (รับทันทีพวกเขากำลังจะไปอย่างรวดเร็ว)

ดังนั้นหากมีรหัสใด ๆ ที่ปฏิเสธชื่อผู้ใช้ที่ขึ้นต้นด้วย [0-9] มันอาจจะเกิดขึ้นในภายหลังโดยโปรแกรมเมอร์บางคนคิดว่า "ทำไมคุณถึงมีชื่อเป็นตัวเลข" อีกครั้งฉันต้องบอกว่าอาจมีรหัส unix ในประวัติศาสตร์ที่ปฏิเสธชื่อผู้ใช้ที่ขึ้นต้นด้วยตัวเลข ฉันแค่ไม่เห็นมัน ตารางรหัสผ่านเริ่มต้นได้รับการแก้ไขด้วยมือฉันจำได้ว่าต้องทำบ่อยครั้งแม้ในช่วงต้นยุค 90

เท่าที่มันยังคงอยู่ฉันจะอ้างถึง stroustrup, C ++ 11FAQ, เมื่อใดที่จะมีไลบรารี่มาตรฐานใหม่ให้ใช้งาน?

เพื่อทำให้ปัญหายากขึ้นโปรดจำไว้ว่ามันเป็นไปไม่ได้ที่จะกำจัดฟีเจอร์เก่า ๆ แม้ว่าคณะกรรมการจะเห็นด้วยว่าพวกเขาไม่ดี: ประสบการณ์แสดงให้เห็นว่าผู้ใช้บังคับให้ผู้ใช้ทุกคนให้คุณสมบัติที่เลิกใช้และถูกแบน มานานหลายทศวรรษ


0

ตามที่ระบุไว้ในคำตอบชื่อผู้ใช้ Linux อาจเป็นตัวเลขได้ทั้งหมด อย่างไรก็ตามนี่เป็นความคิดที่ไม่ดีเพราะจะทำให้เครื่องมือซอฟต์แวร์จำนวนมากสับสน (และ sysadmins มนุษย์!)

ด้วยเหตุผลนี้ตัวอย่างเช่นชื่อผู้ใช้และชื่อกลุ่มที่เป็นตัวเลขทั้งหมดถูกคัดค้านใน RHEL 7 และสิ่งต้องห้ามใน RHEL 8:

8.7.1 shadow-utilsไม่อนุญาตชื่อผู้ใช้และกลุ่มที่เป็นตัวเลขทั้งหมดอีกต่อไป

useraddและgroupaddคำสั่งไม่อนุญาตให้ชื่อผู้ใช้และกลุ่มประกอบด้วยหมดจดของตัวละครที่เป็นตัวเลข เหตุผลที่ไม่อนุญาตให้ใช้ชื่อดังกล่าวคือสิ่งนี้อาจสร้างความสับสนให้กับเครื่องมือจำนวนมากที่ทำงานกับชื่อผู้ใช้และกลุ่มและรหัสผู้ใช้และกลุ่ม (ซึ่งเป็นตัวเลข) โปรดทราบว่าชื่อผู้ใช้และกลุ่มตัวเลขทั้งหมดถูกคัดค้านใน Red Hat Enterprise Linux 7 และการสนับสนุนของพวกเขาจะถูกลบใน Red Hat Enterprise Linux 8 อย่างสมบูรณ์


-2

ฉันไม่แน่ใจว่าฉันจะเรียกมันว่าเป็นเหตุผลทางเทคนิค แต่กฎจะลดลงเหลือ "ชื่อผู้ใช้จะต้องเป็นตัวระบุภาษาโปรแกรมที่ถูกต้อง" ตัวระบุมีคุณสมบัติที่ดีเนื่องจากมีข้อ จำกัด ด้านไวยากรณ์: พวกเขาไม่สามารถเข้าใจผิดว่าเป็นตัวเลขแม้เมื่ออ่านตัวอักษรตามตัวอักษรและพวกเขาไม่จำเป็นต้องอ้างถึงเมื่อผ่านตัวแยกวิเคราะห์ ในระยะสั้นพวกเขาได้รับการยอมรับอย่างง่ายดายว่าเป็นชื่อซึ่งช่วยลดงานเขียนโปรแกรมที่จำเป็นในการทำงานกับพวกเขา

ฉันสงสัยมันก็เคยจำเป็นจริงๆที่จะไม่อนุญาตให้ผู้ใช้งานที่เริ่มต้นด้วยหลัก แต่ "ชื่อผู้ใช้จะต้องระบุว่า" เป็นกฎง่ายๆที่จะได้รับใสถึง 100% ของผู้ใช้ระบบปฏิบัติการยูนิกซ์ต้น

หากสถานที่เดียวที่คุณพิมพ์ชื่อผู้ใช้ของคุณอยู่ที่พรอมต์การเข้าสู่ระบบใน GUI ก็อาจสร้างความแตกต่างให้กับตัวละครรวมถึง (ยกเว้นโมฆะและสิ่งต่าง ๆ เช่นขึ้นบรรทัดใหม่ แต่ถ้าคุณทำงานมากมายจาก commandline ความสะดวกในการมีชื่อผู้ใช้ที่ใช้งานง่าย


Humm ชื่อล็อกอิน (ชื่อผู้ใช้) ไม่มีส่วนเกี่ยวข้องกับตัวระบุภาษาการเขียนโปรแกรม
fpmurphy

และนิยามของชื่อผู้ใช้ที่ถูกต้องนั้นเหมือนกับของตัวระบุนั่นคือประเด็น
alexis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.