Saat menambahkan pengguna baru, bagaimana string divalidasi?
Saya kira ada ekspresi reguler. Apa itu ekspresi reguler?
Saat menambahkan pengguna baru, bagaimana string divalidasi?
Saya kira ada ekspresi reguler. Apa itu ekspresi reguler?
Jawaban:
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 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);
}
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.
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:
^
) hanya dengan huruf kecil atau garis bawah ( [a-z_]
). Ini persis menempati 1 karakter.( ... )
):
{0,31}
) huruf , angka , garis bawah , dan / atau tanda hubung ( [a-z0-9_-]
), OR ( |
)\$
) di akhir, lalu$
).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.
[abcdefghijklmnopqrstuvwxyz]
bukan [a-z]
. [a-z]
di banyak mesin regexp juga cocok dengan hal-hal seperti é
, œ
atau bahkan elemen penyusun multi-karakter seperti dsz
di lokal Hongaria.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);