Apa regex untuk memvalidasi pengguna Linux?

21

Saat menambahkan pengguna baru, bagaimana string divalidasi?

Saya kira ada ekspresi reguler. Apa itu ekspresi reguler?

Ionică Bizău
sumber

Jawaban:

12

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.1ada is_valid_namefungsi 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 sebelum:

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);
}
cuonglm
sumber
15

Dari halaman manual useradd (8) :

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

Pada 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 mematahkan algoritma default untuk definisi direktori home pengguna.

Nama pengguna hanya boleh hingga 32 karakter.

Jadi, ada rekomendasi umum. Kendala aktual tergantung pada spesifikasi implementasi / distribusi Anda. Pada sistem berbasis Debian, ternyata tidak ada kendala yang sangat sulit. Bahkan, saya baru saja mencoba useradd '€'di kotak Ubuntu saya, dan ternyata berhasil. Tentu saja, ini dapat merusak beberapa aplikasi yang tidak mengharapkan nama pengguna yang tidak biasa. Untuk menghindari masalah seperti itu, yang terbaik adalah mengikuti rekomendasi umum.

Malte Skoruppa
sumber
12

Maaf untuk necrobumping pertanyaan yang hampir 4 tahun ini, tetapi muncul cukup tinggi pada hasil pencarian Internet dan itu memerlukan sedikit perhatian lebih.

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

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

Semoga itu membantu beberapa dari mereka yang mencari.

Untuk memecahnya:

  1. Itu harus dimulai ( ^) hanya dengan huruf kecil atau garis bawah ( [a-z_]). Ini persis menempati 1 karakter.
  2. Maka harus salah satu dari baik ( ( ... )):
    1. Dari 0 hingga 31 karakter ( {0,31}) huruf , angka , garis bawah , dan / atau tanda hubung ( [a-z0-9_-]), OR ( |)
    2. Dari 0 hingga 30 karakter di atas ditambah simbol USD ( \$) di akhir, lalu
  3. Tidak ada lagi karakter yang melewati pola ini ( $).

Bagi mereka yang tidak terbiasa dengan pola regex, Anda mungkin bertanya mengapa tanda dolar mengalami garis miring terbalik di 2.2. tetapi tidak dalam 3. Ini karena di sebagian besar (semua?) varian regex, tanda dolar menunjukkan akhir string (atau garis, dll.). Tergantung pada mesin yang digunakan, itu harus diloloskan jika itu adalah bagian dari string yang sebenarnya (saya tidak bisa memikirkan bagian atas kepala saya dari mesin regex yang tidak menggunakan backslash sebagai pelarian 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 sudah diperbaiki, tetapi mereka mengizinkan nama pengguna untuk memulai dengan angka - yang sebenarnya yang menyebabkan ini bug ). Jika Anda ingin menjamin lintas-platform, saya akan merekomendasikan pola regex di atas daripada apa yang melewati / gagal memeriksa di Debian, Ubuntu, dan lainnya.

brent saner
sumber
Jawaban yang bagus Dapat dengan mudah diterapkan juga di Jawa menggunakanjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar
Seharusnya [abcdefghijklmnopqrstuvwxyz]bukan [a-z]. [a-z]di banyak mesin regexp juga cocok dengan hal-hal seperti é, œatau bahkan elemen penyusun multi-karakter seperti dszdi lokal Hongaria.
Stéphane Chazelas
Nama pengguna Linux tidak menerima Unicode (kecuali jika mereka secara eksplisit dikonfigurasi untuk menghentikan kepatuhan POSIX - 1 2 ). Pemeriksaan ini harus dilakukan di luar regex, karena ini merupakan input / lingkungan / validasi lokalisasi, bukan validasi string. Lebih jauh, saya ingin mendengar contoh mesin regex yang melakukan ini. Semua yang saya tahu cocok dengan ASCII dan kita harus mengaktifkan Unicode secara eksplisit, jika itu didukung.
brent saner