एक नया उपयोगकर्ता जोड़ते समय, स्ट्रिंग को कैसे मान्य किया जाता है?
मुझे लगता है कि एक नियमित अभिव्यक्ति है। वह नियमित अभिव्यक्ति क्या है?
एक नया उपयोगकर्ता जोड़ते समय, स्ट्रिंग को कैसे मान्य किया जाता है?
मुझे लगता है कि एक नियमित अभिव्यक्ति है। वह नियमित अभिव्यक्ति क्या है?
जवाबों:
उपयोगकर्ता नाम के लिए सामान्य नियम इसकी लंबाई 32 वर्णों से कम होनी चाहिए। यह आपके वितरण पर निर्भर करता है कि वैध उपयोगकर्ता नाम क्या है।
डेबियन में, shadow-utils 4.1
एक is_valid_name
समारोह है chkname.c
:
static bool is_valid_name (const char *name)
{
/*
* User/group names must match [a-z_][a-z0-9_-]*[$]
*/
if (('\0' == *name) ||
!((('a' <= *name) && ('z' >= *name)) || ('_' == *name))) {
return false;
}
while ('\0' != *++name) {
if (!(( ('a' <= *name) && ('z' >= *name) ) ||
( ('0' <= *name) && ('9' >= *name) ) ||
('_' == *name) ||
('-' == *name) ||
( ('$' == *name) && ('\0' == *(name + 1)) )
)) {
return false;
}
}
return true;
}
और पहले उपयोगकर्ता नाम की लंबाई की जाँच की गई थी:
bool is_valid_user_name (const char *name)
{
/*
* User names are limited by whatever utmp can
* handle.
*/
if (strlen (name) > USER_NAME_MAX_LENGTH) {
return false;
}
return is_valid_name (name);
}
Useradd के मैन पेज से (8) :
यह आमतौर पर केवल उन उपयोगकर्ता नाम का उपयोग करने की सिफारिश की जाती है जो कम केस लेटर या अंडरस्कोर से शुरू होते हैं, उसके बाद लोअर केस लेटर, अंक, अंडरस्कोर या डैश होते हैं। वे एक डॉलर के संकेत के साथ समाप्त हो सकते हैं। नियमित अभिव्यक्ति शब्दों में: [a-z _] [a-z0-9 _-] * * [$]?
डेबियन पर, एकमात्र अड़चन यह है कि उपयोगकर्ता नाम न तो डैश ('-') से शुरू होना चाहिए और न ही इसमें कोई कोलोन (':') या व्हॉट्सएप (स्थान: ''), पंक्ति का अंत: '\ n', सारणीकरण शामिल होना चाहिए। \ t ', आदि)। ध्यान दें कि स्लैश ('/') का उपयोग करने से उपयोगकर्ता के होम डायरेक्टरी की परिभाषा के लिए डिफ़ॉल्ट एल्गोरिथ्म टूट सकता है।
उपयोगकर्ता नाम केवल 32 वर्ण तक हो सकते हैं।
तो, एक सामान्य सिफारिश है। वास्तविक बाधाएँ आपके कार्यान्वयन / वितरण की बारीकियों पर निर्भर करती हैं। डेबियन-आधारित प्रणालियों पर, जाहिरा तौर पर बहुत कठिन बाधाएं नहीं हैं। वास्तव में, मैंने बस useradd '€'
अपने उबंटू बॉक्स पर कोशिश की , और यह काम किया। बेशक, यह कुछ अनुप्रयोगों को तोड़ सकता है जो इस तरह के असामान्य उपयोगकर्ता नाम की उम्मीद नहीं करते हैं। ऐसी समस्याओं से बचने के लिए, सामान्य अनुशंसा का पालन करना सबसे अच्छा है।
लगभग 4 साल पुराने इस सवाल का नेक्रोबंपिंग करने के लिए खेद है, लेकिन यह इंटरनेट खोज परिणामों पर बहुत अधिक आता है और यह थोड़ा और ध्यान देता है।
एक अधिक सटीक रेगेक्स है (हाँ, मुझे पता है, मैन पेज के बावजूद):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
उम्मीद है कि खोज करने वालों में से कुछ मदद करता है।
इसे तोड़ने के लिए:
^
) केवल छोटे अक्षरों या अंडरस्कोर (साथ [a-z_]
)। यह ठीक 1 वर्ण पर है।( ... )
):
{0,31}
के) पत्र , संख्या , अंडरस्कोर , और / या हाइफ़न ( [a-z0-9_-]
), या ( |
)\$
के अंत में एक USD प्रतीक ( ) और फिर$
)।रेगेक्स पैटर्न से अपरिचित लोगों के लिए, आप पूछ सकते हैं कि डॉलर के चिह्न में 2.2 में बैकस्लैश क्यों था। लेकिन 3 में नहीं था। यह इसलिए है क्योंकि अधिकांश (सभी?) रेगेक्स वेरिएंट में, डॉलर का संकेत एक स्ट्रिंग (या रेखा, आदि) के अंत को इंगित करता है। उपयोग किए जा रहे इंजन के आधार पर, इसे बचाना होगा यदि यह वास्तविक तार का हिस्सा है (मैं एक रेगीक्स इंजन के मेरे सिर के ऊपर से नहीं सोच सकता जो शुद्ध अभिव्यक्ति के लिए भागने के रूप में बैकस्लैश का उपयोग नहीं करता है) ।
ध्यान दें कि Debian और Ubuntu एक पूरी तरह से POSIX के लिए कुछ प्रतिबंधों को हटाने / शैडो नदी के ऊपर से शिकायत उपयोगकर्ता नाम (उदाहरण के लिए, और मैं नहीं जानता कि अगर यह तय किया गया है, लेकिन वे उपयोगकर्ता नाम एक संख्या के साथ शुरू करने के लिए अनुमति देते हैं - जो वास्तव में क्या कारण होता है यह बग )। यदि आप क्रॉस-प्लेटफ़ॉर्म की गारंटी देना चाहते हैं, तो मैं डेबियन, उबंटू और अन्य में चेक / पास को विफल करने के बजाय उपरोक्त रेगेक्स पैटर्न की सिफारिश करूंगा।
[abcdefghijklmnopqrstuvwxyz]
बजाय होना चाहिए [a-z]
। [a-z]
कई regexp इंजन में भी कुछ चीजें मेल खाती हैं é
, œ
या यहां तक कि कभी-कभी dsz
हंगेरियन स्थानों जैसे बहु-चरित्र कोलाजिंग तत्व भी ।
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);