Regex để xác nhận người dùng Linux là gì?


21

Khi thêm người dùng mới, chuỗi được xác thực như thế nào?

Tôi cho rằng có một biểu thức chính quy. Biểu hiện thường xuyên đó là gì?

Câu trả lời:


12

Nguyên tắc chung cho tên người dùng là độ dài của nó phải dưới 32 ký tự. Nó phụ thuộc vào phân phối của bạn để tạo tên người dùng hợp lệ.

Trong Debian, shadow-utils 4.1có một is_valid_namechức năng trong 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;
}

Và độ dài của tên người dùng đã được kiểm tra trước:

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

Từ trang man của useradd (8) :

Thông thường chỉ nên sử dụng tên người dùng bắt đầu bằng chữ in thường hoặc gạch dưới, tiếp theo là chữ thường, chữ số, dấu gạch dưới hoặc dấu gạch ngang. Họ có thể kết thúc với một ký hiệu đô la. Trong thuật ngữ biểu thức chính quy: [a-z _] [a-z0-9 _-] * [$]?

Trên Debian, các ràng buộc duy nhất là tên người dùng không được bắt đầu bằng dấu gạch ngang ('-') cũng không chứa dấu hai chấm (':') hoặc khoảng trắng (dấu cách: '', cuối dòng: '\ n', lập bảng: ' \ t ', v.v.). Lưu ý rằng việc sử dụng dấu gạch chéo ('/') có thể phá vỡ thuật toán mặc định cho định nghĩa của thư mục chính của người dùng.

Tên người dùng chỉ có thể dài tối đa 32 ký tự.

Vì vậy, có một khuyến nghị chung. Các ràng buộc thực tế phụ thuộc vào chi tiết cụ thể của việc triển khai / phân phối của bạn. Trên các hệ thống dựa trên Debian, rõ ràng không có ràng buộc nào quá khó khăn. Trên thực tế, tôi vừa thử useradd '€'trên hộp Ubuntu của mình và nó đã hoạt động. Tất nhiên, điều này có thể phá vỡ một số ứng dụng không mong đợi tên người dùng bất thường như vậy. Để tránh những vấn đề như vậy, tốt nhất là làm theo khuyến nghị chung.


12

Xin lỗi vì đã ghi lại câu hỏi gần 4 năm tuổi này, nhưng nó xuất hiện khá cao trên kết quả tìm kiếm trên Internet và nó đảm bảo sự chú ý hơn một chút.

Một regex chính xác hơn là (vâng, tôi biết, mặc dù trang nam):

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

Hy vọng rằng sẽ giúp một số người tìm kiếm.

Để phá vỡ nó:

  1. Nó sẽ bắt đầu ( ^) chỉ với các chữ cái viết thường hoặc dấu gạch dưới ( [a-z_]). Điều này chiếm chính xác 1 ký tự.
  2. Sau đó, nó phải là một trong hai ( ( ... )):
    1. Từ 0 đến 31 ký tự ( {0,31}) của các chữ cái , số , dấu gạch dưới và / hoặc dấu gạch nối ( [a-z0-9_-]), OR ( |)
    2. Từ 0 đến 30 ký tự ở trên cộng với ký hiệu USD ( \$) ở cuối và sau đó
  3. Không có nhiều ký tự qua mẫu này ( $).

Đối với những người không quen thuộc với các mẫu biểu thức chính quy, bạn có thể hỏi tại sao ký hiệu đô la có dấu gạch chéo ngược trong 2.2. nhưng không ở 3. Điều này là do trong hầu hết các biến thể regex (tất cả?), ký hiệu đô la biểu thị sự kết thúc của một chuỗi (hoặc dòng, v.v.). Tùy thuộc vào công cụ đang được sử dụng, nó sẽ cần phải được thoát nếu đó là một phần của chuỗi thực tế (tôi không thể nghĩ ra khỏi đỉnh đầu của một công cụ regex không sử dụng dấu gạch chéo như một lối thoát cho biểu thức thuần túy) .

Lưu ý rằng Debian và Ubuntu loại bỏ một số hạn chế đối với tên người dùng tuân thủ hoàn toàn POSIX / bóng tối (ví dụ: và tôi không biết điều này đã được sửa chưa, nhưng chúng cho phép tên người dùng bắt đầu bằng một số - thực sự là nguyên nhân gây ra điều này lỗi ). Nếu bạn muốn đảm bảo đa nền tảng, tôi khuyên bạn nên sử dụng mẫu regex ở trên thay vì những gì vượt qua / không kiểm tra trong Debian, Ubuntu và các thứ khác.


Câu trả lời chính xác. Cũng có thể dễ dàng áp dụng trong Java bằng cách sử dụngjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar

Nó nên được [abcdefghijklmnopqrstuvwxyz]thay vì [a-z]. [a-z]trong nhiều công cụ regrec cũng phù hợp với những thứ như é, œhoặc thậm chí đôi khi các yếu tố đối chiếu nhiều ký tự như dszở các địa phương Hungary.
Stéphane Chazelas

Tên người dùng Linux không chấp nhận Unicode (trừ khi chúng được cấu hình rõ ràng để phá vỡ tuân thủ POSIX - 1 2 ). Kiểm tra này nên được thực hiện bên ngoài regex, vì đó là xác thực đầu vào / môi trường / nội địa hóa, không phải xác thực chuỗi. Hơn nữa, tôi rất thích nghe một ví dụ về công cụ regex thực hiện điều này. Tất cả những cái tôi biết phù hợp trên ASCII và người ta phải bật Unicode một cách rõ ràng, nếu nó thậm chí còn được hỗ trợ.
brer saner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.