लिनक्स उपयोगकर्ता नाम संख्याओं से शुरू क्यों नहीं हो सकते?


84

क्या कोई तकनीकी कारण है? क्या यह लिनक्स या यूनिक्स के शुरुआती दिनों की एक कलाकृति है, और यदि ऐसा है तो क्यों यह बनी रहती है?


22
चूंकि यह उत्तरों में डिबेक किया गया था, इस कथन के लिए आपका स्रोत क्या है?
lbb0

19
@ l0b0 - प्रति useradd(से shadow-utils 4.2.1) मैनुअल पेज ( CATATS देखें ):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। इसे आर्चलिनक्स पर करने का प्रयास करें ।
दान_क्रांति

1
@don_crissti यह स्पष्ट रूप से सभी लिनक्स डिस्ट्रोस पर लागू नहीं होता है , और इसलिए यह जानना दिलचस्प था कि प्रतिबंध कहाँ से आएगा।
l0b0

5
यहां तक ​​कि उबंटू भी परवाह करता है: जब आप लाइव सीडी / सर्वनाम के साथ इंस्टॉल करते हैं तो आपका उपयोगकर्ता नाम "लोअर-केस लेटर से शुरू होना चाहिए"
43Tesseracts

जवाबों:


136

कुछ कमांड (जैसे chown) किसी उपयोगकर्ता नाम या संख्यात्मक उपयोगकर्ता आईडी को स्वीकार कर सकते हैं, जिससे सभी-संख्यात्मक उपयोगकर्ता नाम को तोड़ दिया जाएगा।

उन नामों को अनुमति देने के लिए एक नियम जो एक संख्या से शुरू होते हैं और कुछ अल्फ़ा होते हैं, संभवतः उन्हें इस प्रयास के लायक नहीं माना जाता था; इसके बजाय एक अल्फा चरित्र के साथ शुरू करने की आवश्यकता है।

संपादित करें:

यह अन्य प्रतिक्रियाओं से प्रतीत होता है कि कुछ डिस्ट्रो ने इस सीमा को हटा दिया है; इस मामले में, GNU कोर यूटिल्स प्रलेखन के अनुसार :

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 == रूट उपयोगकर्ता)। हालाँकि, ध्यान दें कि समूह / उपयोगकर्ता आईडी तर्क एक पूर्णांक के रूप में उनकी व्याख्या को बाध्य करने के लिए '+' द्वारा पूर्ववर्ती हो सकते हैं।


13
यह एकमात्र ऐसा पद है जो वास्तव में प्रश्न का उत्तर देता है। आपको लोगों को यह दिखाने के लिए एक उदाहरण जोड़ना चाहिए कि linux distros पर जो अपस्ट्रीम कोड को useradd 253useradd: invalid user name '253'
म्यूट

2
यदि आप इसे अपनी पोस्ट में जोड़ना चाहते हैं तो रिकॉर्ड के लिए यहाँ स्रोत कोड है
don_crissti

5
क्या आप भ्रम के अवसरों की कल्पना कर सकते हैं यदि उपयोगकर्ता नाम 1000 यूआईडी 253 है? या, सामान्य रूप से, संख्यात्मक उपयोगकर्ता नाम के लिए जो यूआईडी से मेल नहीं खाते हैं? बेशक, समूहों के साथ।
जोनाथन लेफ्लर

5
मेरे पास एक LDAP प्रणाली है जहाँ कुछ उपयोगकर्ताओं के पास अपना (सांख्यिक) कर्मचारी कोड / पंजीकरण संख्या उपयोगकर्ता नाम के रूप में है। मैंने जल्दी से उपयोगकर्ता आईडी ( chown -R $(id -u $username) ...) के लिए कैनोनिकलाइज़ करना सीख लिया ।
मुरु

2
आदर्श रूप से एक उपयोगकर्ता नाम स्ट्रिंग, चाहे संख्या या अक्षर, यूआईडी के लिए मैप किया जाएगा और यूआईडी को निर्धारित करने के लिए हमेशा नामों को देखा गया, जैसा कि आलसी के विपरीत है 'क्या यह संख्या से बना नाम है? तब मैं इसे एक आईडी के रूप में
मैट वारेन

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

और यूनिकोड यू + 1 एफ 600 का उपयोग करके - ode

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
वाह ubuntu अनुमति देता है कि? मुझे आश्चर्य है कि अगर आप कोशिश करते हैं कि क्या हो useradd 1000(मान लें कि आपके पास पहले से ही यूआईडी 1000 वाला उपयोगकर्ता है)
thomas_d_j

8
केवल निषिद्ध प्रतीकों के सभी के लिए +1!
इकोन्स

3
ओह, मैं और बुरा सोच सकता हूं ...
ऑरेंजडॉग

4
@IsmaelMiguel: \0/ a / etc / passwd में एक शाब्दिक शायद कई कार्यक्रमों को तोड़ देगा जो इसे पार्स करते हैं। लेकिन शायद आप मानक उपकरण का उपयोग करके किसी उपयोगकर्ता को उस नाम के साथ पहले स्थान पर नहीं जोड़ सकते। सिस्टम कॉल की तरह mkdir(2)0-टर्मिनेटेड इम्प्लांट-लेंथ स्ट्रिंग्स का भी उपयोग करते हैं, इसलिए आप इसे नहीं बना सकते /home/\0/, क्योंकि वह रास्ता बस है /home
पीटर कॉर्ड्स

9

एक * निक्स उपयोगकर्ता नाम आम तौर पर उपयोगिता द्वारा बनाया गया एक 32 वर्ण लंबा स्ट्रिंग है useradd। जैसा कि आपने कहा, प्रारंभिक यूनिक्स (बीएसडी तकनीकी रूप से) मानकों का प्रत्यक्ष परिणाम है। FreeBSD मैन पेज के अनुसार passwd(5):

लॉगिन नाम एक हाइफ़न (`- ') से शुरू नहीं होना चाहिए, और इसमें 8-बिट वर्ण, टैब या स्पेस या इनमें से कोई भी प्रतीक नहीं हो सकता है:`,: + & #% ^ ()! @ ~ *! <> = | / "'। डॉलर प्रतीक (` $') को सांबा के साथ उपयोग के लिए अंतिम पात्र के रूप में अनुमति दी गई है। किसी भी क्षेत्र में एक बृहदान्त्र (`: ') नहीं हो सकता है क्योंकि यह उपयोगकर्ता में फ़ील्ड को अलग करने के लिए ऐतिहासिक रूप से उपयोग किया गया है। डेटाबेस।

कुछ * निक्स सिस्टम जब उपयोगकर्ता नाम में विशेष वर्णों के साथ अस्पष्ट त्रुटियां फेंकते थे, तो अंततः विशेष वर्णों पर प्रतिबंध लगा दिया गया था। अधिकांश आधुनिक * निक्स प्रणालियों में विशेष चरित्र उपयोगकर्ता नाम का समर्थन करने के लिए passwd/ useraddउपयोगिताओं को बदलना अपेक्षाकृत आसान होगा , लेकिन अधिकांश लोग इस तरह की महत्वहीन चीज को बदलने में संकोच करते हैं, क्योंकि इसका बहुत कम प्रभाव होगा और पीछे की असंगति का कारण होगा।

EDIT:
जैसा कि एडोनिस ने कहा, आधुनिक लिनक्स वितरण में ऐसा करना वास्तव में संभव है, हालांकि यह गलत सलाह है (विशेषकर जब मानकीकृत या विरासत कार्यक्रमों का सामना करते हुए)।


5
ज़रूर, लेकिन सवाल विशेष वर्णों का भी उल्लेख नहीं करता है। यह पूछता है कि उपयोगकर्ता नाम अंकों से शुरू नहीं हो सकते हैं (जो विशेष वर्ण नहीं हैं)।
don_crissti

निश्चित रूप से @don_crissti, क्या आप मुझे फिर से पूछना पसंद करेंगे कि ऐतिहासिक रूप से उपयोगकर्ता नाम एक स्थान से क्यों नहीं शुरू हो सकता है, तो अलग से पूछें कि यह ऐतिहासिक रूप से प्रत्येक प्रतीकों के साथ क्यों शुरू नहीं होता है, तो पूछें और ग ऐतिहासिक रूप से एक $ के साथ समाप्त हो सकता है? यह "उत्तर" एक टिप्पणी के रूप में फिट नहीं है, जो यह स्पष्ट रूप से है, फिर भी प्रश्न से संबंधित उपयोगी जानकारी शामिल है।
फ्रॉमबर्ट

उस पैराग्राफ में 8-बिट चरित्र का क्या मतलब है? IE: निश्चित रूप से किसी भी ascii आकर्षण 8-बिट कर रहे हैं?
मैट वारेन

Feh! /etc/passwdएक पाठ फ़ाइल है। useradd? वाह-निहायती बकवास। असली sysadmins का उपयोग करें vi!
infixed

1
@MattWarren। ASCII एक 7-बिट एन्कोडिंग है
fpmurphy

1

क्या कोई तकनीकी कारण है? क्या यह लिनक्स या यूनिक्स के शुरुआती दिनों की एक कलाकृति है, और यदि ऐसा है तो क्यों यह बनी रहती है?

मैं एक तकनीकी कारण के बारे में नहीं सोच सकता - ऐतिहासिक रूप से, यह सिर्फ ASCII है। यह कैसे पढ़ा जाता है और फिर टाइप किया गया कोडर के हाथों में है।

यूनिक्स इतिहास-रेपो / 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 # पृष्ठ -63 के अनुसार, एक ईमेल "नाम" एक संख्यात्मक के साथ शुरू होने पर कोई प्रतिबंध नहीं है। जीमेल सभी संख्यात्मक उपयोगकर्ता नाम बनाएगा। (अब मिल लो, वे तेजी से जा रहे हैं)।

इसलिए यदि कोई कोड है जो एक उपयोगकर्ता नाम को अस्वीकार करता है जिसकी शुरुआत [0-9] है, तो यह संभवतः बाद में कुछ प्रोग्रामर सोच के साथ अस्तित्व में आया "आपके पास नाम के रूप में एक संख्या क्यों होगी?"। एक बार फिर, मुझे यह कहना है कि बहुत अच्छा ऐतिहासिक यूनिक्स कोड हो सकता है जिसने एक नंबर से शुरू होने वाले उपयोगकर्ता नाम को अस्वीकार कर दिया। मैंने अभी नहीं देखा है। शुरुआती पासवर्ड तालिकाओं को हाथ से संपादित किया गया था, मुझे निश्चित रूप से अक्सर ऐसा करना याद है, यहां तक ​​कि शुरुआत में 90 के दशक में भी।

जहां तक ​​यह जारी रहता है, मैं स्ट्रोस्ट्रुप, सी ++ 11 एफएक्यू को उद्धृत करूंगा, नए मानक पुस्तकालय कब उपलब्ध होंगे?

समस्या को और अधिक कठिन बनाने के लिए, याद रखें कि पुरानी विशेषताओं को समाप्त करना संभव नहीं है, भले ही समिति सहमत हो कि वे खराब हैं: अनुभव से पता चलता है कि उपयोगकर्ता हर कार्यान्वयनकर्ता को अनुकूलता स्विच (या डिफ़ॉल्ट रूप से) के तहत पदावनत और प्रतिबंधित सुविधाएँ प्रदान करने के लिए मजबूर करते हैं। दशकों के लिए।


0

जैसा कि उत्तर में बताया गया है, लिनक्स उपयोगकर्ता नाम सभी-संख्यात्मक हो सकते हैं। हालाँकि, यह एक बुरा विचार है क्योंकि यह कई सॉफ्टवेयर टूल (और मानव 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 में लॉगिन प्रॉम्प्ट पर है, तो शायद इससे कोई फर्क नहीं पड़ता कि इसमें कौन से वर्ण शामिल हैं (nulls और newlines जैसी चीजों को छूट देना, जो लॉगिन प्रक्रिया को भी हिचकी देगा)। लेकिन अगर आप कमांडलाइन से बहुत काम करते हैं, तो एक उपयोगकर्ता नाम रखने की सुविधा जिसके साथ काम करना आसान है।


हम्म, एक लॉगिन (उपयोगकर्ता नाम) का प्रोग्रामिंग भाषा पहचानकर्ता से कोई लेना-देना नहीं है।
fpmurphy

और फिर भी एक वैध उपयोगकर्ता नाम की परिभाषा पहचानकर्ताओं के लिए समान है , यही बात है।
एलेक्सिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.