เมื่อเพิ่มผู้ใช้ใหม่สตริงจะตรวจสอบได้อย่างไร
ฉันคิดว่ามีการแสดงออกปกติ นิพจน์ทั่วไปนั้นคืออะไร?
เมื่อเพิ่มผู้ใช้ใหม่สตริงจะตรวจสอบได้อย่างไร
ฉันคิดว่ามีการแสดงออกปกติ นิพจน์ทั่วไปนั้นคืออะไร?
คำตอบ:
กฎทั่วไปสำหรับชื่อผู้ใช้มีความยาวไม่น้อยกว่า 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);
}
ขอแนะนำให้ใช้ชื่อผู้ใช้ที่ขึ้นต้นด้วยตัวอักษรตัวพิมพ์เล็กหรือขีดล่างตามด้วยตัวอักษรตัวพิมพ์เล็กตัวเลขขีดล่างหรือขีดกลาง พวกเขาสามารถลงท้ายด้วยเครื่องหมายดอลลาร์ ในเงื่อนไขการแสดงออกปกติ: [a-z _] [a-z0-9 _-] * [$]?
บนเดเบียนข้อ จำกัด เพียงอย่างเดียวคือชื่อผู้ใช้ต้องไม่เริ่มต้นด้วยขีดกลาง ('-') และไม่มีเครื่องหมายโคลอน (':') หรือช่องว่าง (ช่องว่าง: '', จุดสิ้นสุดของบรรทัด: '\ n', การจัดระเบียบ: ' \ t 'ฯลฯ ) โปรดทราบว่าการใช้เครื่องหมายทับ ('/') อาจทำให้อัลกอริทึมเริ่มต้นสำหรับคำจำกัดความของโฮมไดเรกทอรีของผู้ใช้
ชื่อผู้ใช้ต้องมีความยาวไม่เกิน 32 อักขระ
ดังนั้นจึงมีข้อเสนอแนะทั่วไป ข้อ จำกัด ที่แท้จริงขึ้นอยู่กับข้อมูลเฉพาะของการนำไปใช้ / การแจกจ่ายของคุณ บนระบบที่ใช้เดเบียนดูเหมือนว่าไม่มีข้อ จำกัด ที่ยากมาก อันที่จริงฉันเพิ่งลองใช้useradd '€'
กล่อง Ubuntu ของฉันและใช้งานได้ แน่นอนว่านี่อาจทำให้แอปพลิเคชั่นบางตัวไม่คาดว่าจะมีชื่อผู้ใช้ที่ผิดปกติ เพื่อหลีกเลี่ยงปัญหาดังกล่าวคุณควรทำตามคำแนะนำทั่วไป
ขออภัยที่ necrobumping คำถามนี้เกือบ 4 ปี แต่มันก็ค่อนข้างสูงในผลการค้นหาทางอินเทอร์เน็ตและมันรับประกันความสนใจเพิ่มขึ้นเล็กน้อย
regex ที่แม่นยำมากขึ้นคือ (ใช่ฉันรู้แม้จะมีหน้าคน):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
หวังว่าจะช่วยให้บางส่วนของการค้นหาเหล่านั้น
เพื่อทำลายมัน:
^
) ด้วยตัวอักษรตัวพิมพ์เล็กเท่านั้นหรือขีดล่าง ( [a-z_]
) ตรงบริเวณนี้มีอักขระ1ตัว( ... )
):
{0,31}
) ของตัวอักษร , ตัวเลข , ขีดและ / หรือยัติภังค์ ( [a-z0-9_-]
) หรือ ( |
)\$
) ที่ท้ายแล้วจากนั้น$
)สำหรับผู้ที่ไม่คุ้นเคยกับรูปแบบ regex คุณอาจถามว่าทำไมเครื่องหมายดอลลาร์มีแบ็กสแลชใน 2.2 แต่ไม่ได้อยู่ใน 3 นี่เป็นเพราะส่วนใหญ่ regex (all?) เครื่องหมายดอลลาร์บ่งบอกถึงจุดสิ้นสุดของสตริง (หรือบรรทัด ฯลฯ ) ขึ้นอยู่กับเครื่องยนต์ที่ใช้มันจะต้องมีการหลบหนีหากเป็นส่วนหนึ่งของสตริงจริง (ฉันไม่สามารถคิดออกจากส่วนหัวของเครื่องยนต์ regex ที่ไม่ใช้แบ็กสแลชเป็นการหลบหนีเพื่อการแสดงออกที่บริสุทธิ์) .
โปรดทราบว่า Debian และ Ubuntu ลบข้อ จำกัด บางอย่างสำหรับ POSIX อย่างเต็มที่ / เงาชื่อผู้ใช้ที่สอดคล้องต้นน้ำ (เช่นและฉันไม่ทราบว่านี้ได้รับการแก้ไข แต่พวกเขาช่วยให้ชื่อผู้ใช้ที่จะเริ่มต้นด้วยจำนวน - ที่จริงเป็นสิ่งที่เกิดขึ้นนี้ บั๊ก ) หากคุณต้องการรับประกันข้ามแพลตฟอร์มฉันขอแนะนำรูปแบบ regex ด้านบนมากกว่าสิ่งที่ผ่าน / ไม่ผ่านการตรวจสอบใน Debian, Ubuntu และอื่น ๆ
[abcdefghijklmnopqrstuvwxyz]
ในเครื่องมือ regexp จำนวนมากยังตรงกับสิ่งที่ชอบ, หรือแม้กระทั่งบางครั้งองค์ประกอบหลายตัวเรียงเช่นในตำแหน่งที่ฮังการี [a-z]
[a-z]
é
œ
dsz
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);