Linuxユーザーを検証する正規表現とは何ですか?


回答:


12

ユーザー名の一般的なルールは、その長さが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);
}

15

useradd(8)manページから:

通常、小文字またはアンダースコアで始まり、その後に小文字、数字、アンダースコア、またはダッシュが続くユーザー名のみを使用することをお勧めします。彼らはドル記号で終わることができます。正規表現では:[a-z _] [a-z0-9 _-] * [$]?

Debianでは、ユーザー名はダッシュ( '-')で始まったり、コロン( ':')または空白(スペース: ''、行末: '\ n'、タブレーション: 'を含んではならないという唯一の制約があります。 \ t 'など)。スラッシュ( '/')を使用すると、ユーザーのホームディレクトリを定義するためのデフォルトのアルゴリズムが破損する可能性があることに注意してください。

ユーザー名の最大長は32文字です。

そのため、一般的な推奨事項があります。実際の制約は、実装/配布の詳細に依存します。Debianベースのシステムでは、明らかに非常に厳しい制約はありません。実際、useradd '€'Ubuntuボックスを試してみたところ、うまくいきました。もちろん、このような異常なユーザー名を期待しない一部のアプリケーションが破損する可能性があります。このような問題を回避するには、一般的な推奨事項に従うことをお勧めします。


12

このほぼ4年前の質問を壊してすみませんが、インターネット検索結果でかなり高くなり、もう少し注意が必要です。

より正確な正規表現は次のとおりです(はい、manページにもかかわらずそうです):

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

うまくいけば、それがそれらの検索の一部を助けます。

分解するには:

  1. それはすべき開始^小文字のみまたはアンダースコア(と)[a-z_])。これは、正確に1文字を占有します。
  2. そして、それがあるべき1どちらか( ... )):
    1. 0への31文字({0,31})の文字数字アンダースコア、および/またはハイフン[a-z0-9_-])、OR|
    2. 030上の文字プラスドル記号(\$次に端)、および
  3. これ以上の文字の過去、このパターン($)。

正規表現パターンに慣れていない人のために、2.2でドル記号にバックスラッシュがあった理由を尋ねることができます。これは、ほとんどの(すべて?)正規表現バリアントで、ドル記号が文字列(または行など)の終わりを示すためです。使用されているエンジンに応じて、実際の文字列の一部である場合はエスケープする必要があります(バックスラッシュを純粋な式のエスケープとして使用しない正規表現エンジンの頭上から考えることはできません) 。

DebianとUbuntuは、完全にPOSIX / shadowアップストリームに準拠したユーザー名の制限をいくつか削除することに注意してください(たとえば、これが修正されたかどうかはわかりませんが、ユーザー名を数字で始めることができます-これが実際にこの原因ですバグ)。クロスプラットフォームを保証したい場合は、Debian、Ubuntuなどでチェックに合格/失敗するものではなく、上記の正規表現パターンをお勧めします。


素晴らしい答え。使用してJavaでも簡単に適用できますjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
-dokaspar

[abcdefghijklmnopqrstuvwxyz]代わりになり[a-z]ます。[a-z]多くの正規表現エンジンではé、のようなもの、œまたはdszハンガリー語ロケールのような複数文字の照合要素も一致します。
ステファンシャゼラス

Linuxユーザー名はUnicodeを受け入れません(POSIX準拠に違反するように明示的に構成されている場合を除きます-1 2)。このチェックは、文字列の検証ではなく、入力/環境/ローカリゼーションの検証であるため、正規表現の外部で実行する必要があります。さらに、これを行う正規表現エンジンの例を聞きたいです。私が知っているものはすべてASCIIで一致しており、サポートされている場合でもUnicodeを明示的に有効にする必要があります。
ブレントセイナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.