regex เพื่อตรวจสอบผู้ใช้ Linux คืออะไร?


21

เมื่อเพิ่มผู้ใช้ใหม่สตริงจะตรวจสอบได้อย่างไร

ฉันคิดว่ามีการแสดงออกปกติ นิพจน์ทั่วไปนั้นคืออะไร?

คำตอบ:


12

กฎทั่วไปสำหรับชื่อผู้ใช้มีความยาวไม่น้อยกว่า 32 ตัว ขึ้นอยู่กับการกระจายของคุณเพื่อสร้างชื่อผู้ใช้ที่ถูกต้อง

ใน Debian 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 '€'กล่อง Ubuntu ของฉันและใช้งานได้ แน่นอนว่านี่อาจทำให้แอปพลิเคชั่นบางตัวไม่คาดว่าจะมีชื่อผู้ใช้ที่ผิดปกติ เพื่อหลีกเลี่ยงปัญหาดังกล่าวคุณควรทำตามคำแนะนำทั่วไป


12

ขออภัยที่ necrobumping คำถามนี้เกือบ 4 ปี แต่มันก็ค่อนข้างสูงในผลการค้นหาทางอินเทอร์เน็ตและมันรับประกันความสนใจเพิ่มขึ้นเล็กน้อย

regex ที่แม่นยำมากขึ้นคือ (ใช่ฉันรู้แม้จะมีหน้าคน):

^[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. ไม่มีอักขระเกินกว่ารูปแบบนี้ ( $)

สำหรับผู้ที่ไม่คุ้นเคยกับรูปแบบ regex คุณอาจถามว่าทำไมเครื่องหมายดอลลาร์มีแบ็กสแลชใน 2.2 แต่ไม่ได้อยู่ใน 3 นี่เป็นเพราะส่วนใหญ่ regex (all?) เครื่องหมายดอลลาร์บ่งบอกถึงจุดสิ้นสุดของสตริง (หรือบรรทัด ฯลฯ ) ขึ้นอยู่กับเครื่องยนต์ที่ใช้มันจะต้องมีการหลบหนีหากเป็นส่วนหนึ่งของสตริงจริง (ฉันไม่สามารถคิดออกจากส่วนหัวของเครื่องยนต์ regex ที่ไม่ใช้แบ็กสแลชเป็นการหลบหนีเพื่อการแสดงออกที่บริสุทธิ์) .

โปรดทราบว่า Debian และ Ubuntu ลบข้อ จำกัด บางอย่างสำหรับ POSIX อย่างเต็มที่ / เงาชื่อผู้ใช้ที่สอดคล้องต้นน้ำ (เช่นและฉันไม่ทราบว่านี้ได้รับการแก้ไข แต่พวกเขาช่วยให้ชื่อผู้ใช้ที่จะเริ่มต้นด้วยจำนวน - ที่จริงเป็นสิ่งที่เกิดขึ้นนี้ บั๊ก ) หากคุณต้องการรับประกันข้ามแพลตฟอร์มฉันขอแนะนำรูปแบบ regex ด้านบนมากกว่าสิ่งที่ผ่าน / ไม่ผ่านการตรวจสอบใน Debian, Ubuntu และอื่น ๆ


คำตอบที่ดี สามารถนำไปใช้อย่างง่ายดายใน Java โดยใช้java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar

มันควรจะเป็นแทน[abcdefghijklmnopqrstuvwxyz] ในเครื่องมือ regexp จำนวนมากยังตรงกับสิ่งที่ชอบ, หรือแม้กระทั่งบางครั้งองค์ประกอบหลายตัวเรียงเช่นในตำแหน่งที่ฮังการี [a-z][a-z]éœdsz
Stéphane Chazelas

ชื่อผู้ใช้ Linux ไม่ยอมรับ Unicode (เว้นแต่ว่าพวกเขาจะได้รับการกำหนดค่าอย่างชัดเจนเพื่อทำลายการปฏิบัติตาม POSIX - 1 2 ) การตรวจสอบนี้ควรทำนอก regex เนื่องจากเป็นการตรวจสอบอินพุต / สภาพแวดล้อม / การโลคัลไลซ์ไม่ใช่การตรวจสอบสตริง นอกจากนี้ฉันชอบที่จะได้ยินตัวอย่างของเครื่องมือ regex ที่ทำสิ่งนี้ สิ่งที่ฉันรู้เกี่ยวกับการจับคู่ใน ASCII และหนึ่งมีการเปิดใช้งาน Unicode อย่างชัดเจนถ้ามันได้รับการสนับสนุน
รนต์ saner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.