Yeni bir kullanıcı eklerken, dize nasıl doğrulanır?
Sanırım düzenli bir ifade var. Bu düzenli ifade nedir?
Yeni bir kullanıcı eklerken, dize nasıl doğrulanır?
Sanırım düzenli bir ifade var. Bu düzenli ifade nedir?
Yanıtlar:
Kullanıcı adı için genel kural uzunluğu 32 karakterden az olmalıdır. Geçerli kullanıcı adını oluşturmak dağıtımınıza bağlıdır.
Debian'da, shadow-utils 4.1
bir is_valid_name
işlev vardır 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;
}
Ve kullanıcı adının uzunluğu daha önce kontrol edildi:
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);
}
Gönderen useradd komutunun (8) man sayfalarına :
Genellikle yalnızca küçük harf veya alt çizgi ile başlayan, ardından küçük harf, rakam, alt çizgi veya tire içeren kullanıcı adlarının kullanılması önerilir. Dolar işareti ile bitebilirler. Normal ifade terimleriyle: [a-z _] [a-z0-9 _-] * [$]?
Debian'da tek kısıtlama, kullanıcı adlarının bir tire ('-') ile başlamaması veya iki nokta üst üste (':') veya boşluk (boşluk: '', satır sonu: '\ n', sekme: 'içermemesidir. \ t 'vb.). Eğik çizgi ('/') kullanmanın, kullanıcının ana dizininin tanımı için varsayılan algoritmayı kırabileceğini unutmayın.
Kullanıcı adları en fazla 32 karakter uzunluğunda olabilir.
Yani, genel bir öneri var. Gerçek kısıtlamalar, uygulamanızın / dağıtımınızın özelliklerine bağlıdır. Debian tabanlı sistemlerde, görünüşe göre çok zor kısıtlamalar yoktur. Aslında, useradd '€'
Ubuntu kutumu denedim ve işe yaradı. Tabii ki, bu olağandışı kullanıcı adları beklemeyen bazı uygulamaları kırabilir. Bu tür problemlerden kaçınmak için, genel tavsiyeye uymak en iyisidir.
Neredeyse 4 yaşındaki bu soruyu necrobumping için üzgünüm, ancak İnternet arama sonuçlarında oldukça yüksek geliyor ve biraz daha dikkat gerektiriyor.
Daha doğru bir regex (evet, man sayfasına rağmen biliyorum):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
Umarım bu bazı arama yardımcı olur.
Yıkmak için:
^
sadece küçük harfli harf veya bir alt çizgi (ile) [a-z_]
). Bu tam olarak 1 karakter kaplar .( ... )
):
{0,31}
) ait harfler , sayılar , alt çizgi ve / veya tire ( [a-z0-9_-]
), OR ( |
)\$
) ve ardından$
).Normal ifade kalıplarına aşina olmayanlar için, dolar işaretinin neden 2.2'de ters eğik çizgi olduğunu sorabilirsiniz. ancak 3'te olmadı. Bunun nedeni çoğu (tümü?) normal ifade değişkenlerinde dolar işareti bir dizenin (veya satırın vb.) sonunu gösterir. Kullanılan motora bağlı olarak, gerçek dizenin bir parçası ise kaçması gerekir (saf bir ifade için kaçış olarak ters eğik çizgi kullanmayan bir regex motorunun başımın üstünü düşünemiyorum) .
Not Debian ve Ubuntu tam POSIX bazı kısıtlamaları kaldırmak olduğunu / örneğin (memba uyumlu kullanıcı adı gölge ve bu sabit olup olmadığını bilmiyorum, ama adı bir sayı ile başlatmasına izin - aslında neyin sebep olduğu bu hata ). Çapraz platform garantisini vermek istiyorsanız, Debian, Ubuntu ve diğerlerinde kontrolü geçen / başarısız olandan ziyade yukarıdaki regex modelini öneriyorum.
[abcdefghijklmnopqrstuvwxyz]
yerine olmalı [a-z]
. [a-z]
regexp motorlarının çoğunda Macar yerellerinde olduğu gibi é
, œ
hatta bazen çok karakterli harmanlayıcı öğelerle de eşleşir dsz
.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);