回答:
ユーザー名の一般的なルールは、その長さが32文字未満でなければならないことです。有効なユーザー名を作成するかどうかはディストリビューションに依存します。
Debianではshadow-utils 4.1
、にis_valid_name
機能があります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;
}
そして、ユーザー名の長さは前にチェックされました:
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);
}
useradd(8)のmanページから:
通常、小文字またはアンダースコアで始まり、その後に小文字、数字、アンダースコア、またはダッシュが続くユーザー名のみを使用することをお勧めします。彼らはドル記号で終わることができます。正規表現では:[a-z _] [a-z0-9 _-] * [$]?
Debianでは、ユーザー名はダッシュ( '-')で始まったり、コロン( ':')または空白(スペース: ''、行末: '\ n'、タブレーション: 'を含んではならないという唯一の制約があります。 \ t 'など)。スラッシュ( '/')を使用すると、ユーザーのホームディレクトリを定義するためのデフォルトのアルゴリズムが破損する可能性があることに注意してください。
ユーザー名の最大長は32文字です。
そのため、一般的な推奨事項があります。実際の制約は、実装/配布の詳細に依存します。Debianベースのシステムでは、明らかに非常に厳しい制約はありません。実際、useradd '€'
Ubuntuボックスを試してみたところ、うまくいきました。もちろん、このような異常なユーザー名を期待しない一部のアプリケーションが破損する可能性があります。このような問題を回避するには、一般的な推奨事項に従うことをお勧めします。
このほぼ4年前の質問を壊してすみませんが、インターネット検索結果でかなり高くなり、もう少し注意が必要です。
より正確な正規表現は次のとおりです(はい、manページにもかかわらずそうです):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
うまくいけば、それがそれらの検索の一部を助けます。
分解するには:
^
小文字のみまたはアンダースコア(と)[a-z_]
)。これは、正確に1文字を占有します。( ... )
):
{0,31}
)の文字、数字、アンダースコア、および/またはハイフン([a-z0-9_-]
)、OR(|
)\$
次に端)、および$
)。正規表現パターンに慣れていない人のために、2.2でドル記号にバックスラッシュがあった理由を尋ねることができます。これは、ほとんどの(すべて?)正規表現バリアントで、ドル記号が文字列(または行など)の終わりを示すためです。使用されているエンジンに応じて、実際の文字列の一部である場合はエスケープする必要があります(バックスラッシュを純粋な式のエスケープとして使用しない正規表現エンジンの頭上から考えることはできません) 。
DebianとUbuntuは、完全にPOSIX / shadowアップストリームに準拠したユーザー名の制限をいくつか削除することに注意してください(たとえば、これが修正されたかどうかはわかりませんが、ユーザー名を数字で始めることができます-これが実際にこの原因ですバグ)。クロスプラットフォームを保証したい場合は、Debian、Ubuntuなどでチェックに合格/失敗するものではなく、上記の正規表現パターンをお勧めします。
[abcdefghijklmnopqrstuvwxyz]
代わりになり[a-z]
ます。[a-z]
多くの正規表現エンジンではé
、のようなもの、œ
またはdsz
ハンガリー語ロケールのような複数文字の照合要素も一致します。
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);