このほぼ 4 年前の質問をネクロバンプして申し訳ありませんが、インターネットの検索結果でかなり上位に表示されるため、もう少し注意が必要です。
より正確な正規表現は次のとおりです (はい、man ページにもかかわらず知っています):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
願わくば、それが検索している人の助けになることを願っています.
分解するには:
<オール>^
) 小文字またはアンダースコアのみ ([a-z_]
) )。これは正確に 1 を占めます ( ... )
):<オール> {0,31}
)/文字 、数字 、アンダースコア 、および/またはハイフン ([a-z0-9_-]
)、または (|
)\$
) 最後に$
).正規表現パターンに慣れていない人は、2.2 でドル記号にバックスラッシュがあった理由を尋ねるかもしれません。しかし 3 にはありませんでした。これは、ほとんどの (すべて?) 正規表現の亜種で、ドル記号が文字列 (または行など) の終わりを示すためです。使用しているエンジンによっては、それが実際の文字列の一部である場合はエスケープする必要があります (純粋な式のエスケープとしてバックスラッシュを使用しない正規表現エンジンを頭の中で考えることはできません)。 .
Debian と Ubuntu では、完全に POSIX/シャドウ アップストリームに準拠したユーザー名に対するいくつかの制限が削除されていることに注意してください (たとえば、これが修正されたかどうかはわかりませんが、ユーザー名を数字で開始することを許可しています。これが実際にこの問題を引き起こした原因です)。バグ)。クロスプラットフォームを保証したい場合は、Debian や Ubuntu などでのチェックの合格/不合格ではなく、上記の正規表現パターンをお勧めします。
useradd (8) の man ページから:
<ブロック引用>通常は、小文字またはアンダースコアで始まり、その後に小文字、数字、アンダースコア、またはダッシュが続くユーザー名のみを使用することをお勧めします。ドル記号で終了できます。正規表現用語:[a-z_][a-z0-9_-]*[$]?
Debian では、唯一の制約は、ユーザー名がダッシュ ('-') で始まったり、コロン (':') や空白 (スペース:' '、行末:'\n'、表:' \t' など)。スラッシュ (「/」) を使用すると、ユーザーのホーム ディレクトリを定義するための既定のアルゴリズムが壊れる可能性があることに注意してください。
ユーザー名の長さは 32 文字までです。
だから、一般的な推奨事項があります。実際の制約は、実装/配布の詳細によって異なります。 Debian ベースのシステムでは、明らかに厳しい制約はありません。実際、私は useradd '€'
を試しました 私のUbuntuボックスで、それはうまくいきました。もちろん、これにより、そのような異常なユーザー名を予期しない一部のアプリケーションが機能しなくなる可能性があります。このような問題を回避するには、一般的な推奨事項に従うことをお勧めします。
ユーザー名の一般的な規則は、その長さが 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);
}