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

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

新しいユーザーを追加するときに文字列を確認するにはどうすればよいですか?

正規表現が欲しいです。その正規表現は何ですか?

答え1

ほぼ4年も経ったこの質問について徹底的な議論をして申し訳ありません。しかし、インターネット検索結果でかなり高いランクを占めているので、より多くの注意を払う価値があります。

より正確な正規表現は次のとおりです(はい、マンページにもかかわらず知っています)。

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

お探しの方にお役に立てば幸いです。

それを破壊する:

  1. そうしなければならないスタート^)には小文字または下線([a-z_])のみが含まれています。これがぴったりです1特徴。

  2. それではそうです。一つ~の誰でも( ( ... )):

    1. ~から0到着31性格( {0,31})手紙数字下線、そして/またはハイフン[a-z0-9_-])、

    または( |)

    1. ~から0到着30上記の文字追加する\$最後にドル記号()があり、

    それから

  3. もう文字がありません過去このモード( $)。

正規表現に慣れていない人のために、2.2ではドル記号にバックスラッシュがありますが、3ではない理由が何であるか疑問に思います。これは、ほとんどの(すべて?)正規表現の変形では、ドル記号が文字列(または行)などの終わりを表すためです。 )。使用されるエンジンによっては、実際の文字列の一部である場合はエスケープする必要があります(バックスラッシュをエスケープとして使用しない正規表現エンジンは想像できません)。

DebianとUbuntuは、POSIX /シャドウアップストリームと完全に互換性のあるユーザー名に対するいくつかの制限を削除しました(たとえば、これが変更されたかどうかはわかりませんが、ユーザー名が数字で始まるようにしました。実際にはこのエラー)。クロスプラットフォームを保証するには、Debian、Ubuntuなどの合格/失敗の確認正規表現の代わりに上記の正規表現を使用することをお勧めします。

答え2

~からuseradd(8) のマニュアルページ:

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

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

ユーザー名は最大32文字まで可能です。

だから一般的な提案です。実際の制限は、実装/配布の詳細によって異なります。 Debian ベースのシステムには非常に厳しい制限はありません。実際、useradd '€'Ubuntuボックスで試してみたところ、効果がありました。もちろん、これにより、これらの珍しいユーザー名を期待していないアプリケーションの一部がクラッシュする可能性があります。これらの問題を回避するには、一般的な推奨事項に従ってください。

答え3

ユーザー名の一般的な規則は、長さが32文字未満でなければならないことです。有効なユーザー名はディストリビューションによって異なります。

Debian には次の機能がshadow-utils 4.1あります。is_valid_namechkname.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);
}

関連情報