GNU/Linux >> Belajar Linux >  >> Linux

Apa regex untuk memvalidasi pengguna Linux?

Maaf telah melakukan necrobumping pada pertanyaan yang hampir berusia 4 tahun ini, tetapi pertanyaan ini muncul cukup tinggi di hasil penelusuran Internet dan membutuhkan lebih banyak perhatian.

Regex yang lebih akurat adalah (ya, saya tahu, terlepas dari halaman manualnya):

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

Semoga itu membantu beberapa dari mereka yang mencari.

Untuk memecahnya:

  1. Seharusnya dimulai (^ ) hanya dengan huruf kecil atau garis bawah ([a-z_] ). Ini menempati tepat 1 karakter.
  2. Maka itu harus satu dari salah satu (( ... ) ):
    1. Dari 0 sampai 31 karakter ({0,31} ) dari huruf , angka , garis bawah , dan/atau tanda hubung ([a-z0-9_-] ), ATAU (| )
    2. Dari 0 hingga 30 karakter dari plus di atas simbol USD (\$ ) di bagian akhir, lalu
  3. Tidak ada lagi karakter masa lalu pola ini ($ ).

Bagi mereka yang tidak terbiasa dengan pola regex, Anda mungkin bertanya mengapa tanda dolar memiliki garis miring terbalik di 2.2. tetapi tidak di 3. Ini karena di sebagian besar (semua?) varian regex, tanda dolar menunjukkan akhir dari sebuah string (atau baris, dll.). Bergantung pada mesin yang digunakan, itu perlu diloloskan jika itu adalah bagian dari string yang sebenarnya (Saya tidak dapat memikirkan bagian atas kepala saya tentang mesin regex yang tidak menggunakan garis miring terbalik sebagai jalan keluar untuk ekspresi murni) .

Perhatikan bahwa Debian dan Ubuntu menghapus beberapa batasan untuk nama pengguna yang sepenuhnya sesuai dengan POSIX/shadow upstream (misalnya, dan saya tidak tahu apakah ini telah diperbaiki, tetapi mereka mengizinkan nama pengguna untuk memulai dengan angka - yang sebenarnya menyebabkan ini serangga). Jika Anda ingin menjamin lintas platform, saya akan merekomendasikan pola regex di atas daripada yang lolos/gagal dalam pemeriksaan di Debian, Ubuntu, dan lainnya.


Dari halaman manual useradd (8):

Biasanya disarankan untuk hanya menggunakan nama pengguna yang dimulai dengan huruf kecil atau garis bawah, diikuti dengan huruf kecil, angka, garis bawah, atau tanda pisah. Mereka bisa diakhiri dengan tanda dolar. Dalam istilah ekspresi reguler:[a-z_][a-z0-9_-]*[$]?

Di Debian, satu-satunya kendala adalah bahwa nama pengguna tidak boleh dimulai dengan tanda hubung ('-') atau mengandung titik dua (':') atau spasi putih (spasi:' ', akhir baris:'\n', tabulasi:' \t', dll). Perhatikan bahwa menggunakan garis miring ('/') dapat merusak algoritme default untuk definisi direktori beranda pengguna.

Panjang nama pengguna hanya boleh hingga 32 karakter.

Jadi, ada rekomendasi umum. Kendala sebenarnya bergantung pada spesifikasi implementasi / distribusi Anda. Pada sistem berbasis Debian, ternyata tidak ada kendala yang sangat berat. Sebenarnya, saya baru saja mencoba useradd '€' di kotak Ubuntu saya, dan berhasil. Tentu saja, ini dapat merusak beberapa aplikasi yang tidak mengharapkan nama pengguna yang tidak biasa. Untuk menghindari masalah seperti itu, sebaiknya ikuti rekomendasi umum.


Aturan umum untuk nama pengguna adalah panjangnya harus kurang dari 32 karakter. Itu tergantung pada distribusi Anda untuk membuat nama pengguna yang valid.

Di Debian, shadow-utils 4.1 , ada is_valid_name fungsi di 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;
}

Dan panjang nama pengguna diperiksa sebelumnya:

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);
}

Linux
  1. Apa VPS Terbaik:Windows atau Linux?

  2. Apa sumber kernel Linux saat ini?

  3. Apa definisi sesi di linux?

  1. Apa yang membuat Linux menjadi OS yang berkelanjutan

  2. Apa urutan default dari jenis Linux?

  3. Apa arti curl -k -i -X ​​di Linux?

  1. Apa yang membuat komunitas Linux istimewa?

  2. Linux vs. Unix:Apa bedanya?

  3. Apa Itu Linux? Panduan untuk Pengguna Non-teknis