लिनक्स उपयोगकर्ताओं को मान्य करने के लिए regex क्या है?


21

एक नया उपयोगकर्ता जोड़ते समय, स्ट्रिंग को कैसे मान्य किया जाता है?

मुझे लगता है कि एक नियमित अभिव्यक्ति है। वह नियमित अभिव्यक्ति क्या है?

जवाबों:


12

उपयोगकर्ता नाम के लिए सामान्य नियम इसकी लंबाई 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);
}

15

Useradd के मैन पेज से (8) :

यह आमतौर पर केवल उन उपयोगकर्ता नाम का उपयोग करने की सिफारिश की जाती है जो कम केस लेटर या अंडरस्कोर से शुरू होते हैं, उसके बाद लोअर केस लेटर, अंक, अंडरस्कोर या डैश होते हैं। वे एक डॉलर के संकेत के साथ समाप्त हो सकते हैं। नियमित अभिव्यक्ति शब्दों में: [a-z _] [a-z0-9 _-] * * [$]?

डेबियन पर, एकमात्र अड़चन यह है कि उपयोगकर्ता नाम न तो डैश ('-') से शुरू होना चाहिए और न ही इसमें कोई कोलोन (':') या व्हॉट्सएप (स्थान: ''), पंक्ति का अंत: '\ n', सारणीकरण शामिल होना चाहिए। \ t ', आदि)। ध्यान दें कि स्लैश ('/') का उपयोग करने से उपयोगकर्ता के होम डायरेक्टरी की परिभाषा के लिए डिफ़ॉल्ट एल्गोरिथ्म टूट सकता है।

उपयोगकर्ता नाम केवल 32 वर्ण तक हो सकते हैं।

तो, एक सामान्य सिफारिश है। वास्तविक बाधाएँ आपके कार्यान्वयन / वितरण की बारीकियों पर निर्भर करती हैं। डेबियन-आधारित प्रणालियों पर, जाहिरा तौर पर बहुत कठिन बाधाएं नहीं हैं। वास्तव में, मैंने बस useradd '€'अपने उबंटू बॉक्स पर कोशिश की , और यह काम किया। बेशक, यह कुछ अनुप्रयोगों को तोड़ सकता है जो इस तरह के असामान्य उपयोगकर्ता नाम की उम्मीद नहीं करते हैं। ऐसी समस्याओं से बचने के लिए, सामान्य अनुशंसा का पालन करना सबसे अच्छा है।


12

लगभग 4 साल पुराने इस सवाल का नेक्रोबंपिंग करने के लिए खेद है, लेकिन यह इंटरनेट खोज परिणामों पर बहुत अधिक आता है और यह थोड़ा और ध्यान देता है।

एक अधिक सटीक रेगेक्स है (हाँ, मुझे पता है, मैन पेज के बावजूद):

^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$

उम्मीद है कि खोज करने वालों में से कुछ मदद करता है।

इसे तोड़ने के लिए:

  1. यह चाहिए शुरू ( ^) केवल छोटे अक्षरों या अंडरस्कोर (साथ [a-z_])। यह ठीक 1 वर्ण पर है।
  2. तो यह होना चाहिए एक की या तो ( ( ... )):
    1. से 0 करने के लिए 31 वर्ण ( {0,31}के) पत्र , संख्या , अंडरस्कोर , और / या हाइफ़न ( [a-z0-9_-]), या ( |)
    2. ऊपर से 0 से 30 अक्षर से अधिक\$ के अंत में एक USD प्रतीक ( ) और फिर
  3. इस पैटर्न से अधिक वर्ण अतीत में नहीं हैं ( $)।

रेगेक्स पैटर्न से अपरिचित लोगों के लिए, आप पूछ सकते हैं कि डॉलर के चिह्न में 2.2 में बैकस्लैश क्यों था। लेकिन 3 में नहीं था। यह इसलिए है क्योंकि अधिकांश (सभी?) रेगेक्स वेरिएंट में, डॉलर का संकेत एक स्ट्रिंग (या रेखा, आदि) के अंत को इंगित करता है। उपयोग किए जा रहे इंजन के आधार पर, इसे बचाना होगा यदि यह वास्तविक तार का हिस्सा है (मैं एक रेगीक्स इंजन के मेरे सिर के ऊपर से नहीं सोच सकता जो शुद्ध अभिव्यक्ति के लिए भागने के रूप में बैकस्लैश का उपयोग नहीं करता है) ।

ध्यान दें कि Debian और Ubuntu एक पूरी तरह से POSIX के लिए कुछ प्रतिबंधों को हटाने / शैडो नदी के ऊपर से शिकायत उपयोगकर्ता नाम (उदाहरण के लिए, और मैं नहीं जानता कि अगर यह तय किया गया है, लेकिन वे उपयोगकर्ता नाम एक संख्या के साथ शुरू करने के लिए अनुमति देते हैं - जो वास्तव में क्या कारण होता है यह बग )। यदि आप क्रॉस-प्लेटफ़ॉर्म की गारंटी देना चाहते हैं, तो मैं डेबियन, उबंटू और अन्य में चेक / पास को विफल करने के बजाय उपरोक्त रेगेक्स पैटर्न की सिफारिश करूंगा।


बहुत बढ़िया जवाब। आसानी से जावा में भी प्रयोग किया जा सकता हैjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar

इसके [abcdefghijklmnopqrstuvwxyz]बजाय होना चाहिए [a-z][a-z]कई regexp इंजन में भी कुछ चीजें मेल खाती हैं é, œया यहां तक ​​कि कभी-कभी dszहंगेरियन स्थानों जैसे बहु-चरित्र कोलाजिंग तत्व भी ।
स्टीफन चेजालस

लिनक्स उपयोगकर्ता नाम यूनिकोड को स्वीकार नहीं करते हैं (जब तक कि उन्हें POSIX अनुपालन को तोड़ने के लिए स्पष्ट रूप से कॉन्फ़िगर नहीं किया जाता है - 1 2 )। यह चेक रेगेक्स के बाहर किया जाना चाहिए, क्योंकि यह एक इनपुट / पर्यावरण / स्थानीयकरण सत्यापन है, न कि स्ट्रिंग सत्यापन। इसके अलावा, मुझे रेगेक्स इंजन का एक उदाहरण सुनना अच्छा लगेगा जो ऐसा करता है। सभी लोग जो मुझे ASCII पर मैच के बारे में जानते हैं और एक को यूनिकोड को स्पष्ट रूप से सक्षम करना है, अगर यह भी समर्थित है।
ब्रेंट सैनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.