web-dev-qa-db-ja.com

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

新しいユーザーを追加するとき、文字列はどのように検証されますか?

正規表現があると思います。その正規表現とは何ですか?

22
Ionică Bizău

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

Debianでは、shadow-utils 4.1is_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);
}
13
cuonglm

seradd(8)のmanページ から:

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

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

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

したがって、一般的な推奨事項があります。実際の制約は、実装/配布の詳細によって異なります。 Debianベースのシステムでは、明らかに厳しい制約はありません。実際、私はuseradd '€'私のUbuntuボックスで動作しました。もちろん、これはそのような変わったユーザー名を期待しないいくつかのアプリケーションを壊すかもしれません。このような問題を回避するには、一般的な推奨事項に従うことをお勧めします。

15
Malte Skoruppa

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

より正確な正規表現は(そうです、私は知っています、manページにもかかわらず):

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

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

分解するには:

  1. start^)小文字またはアンダースコア([a-z_])。これは正確に1文字を占めます。
  2. 次に、oneどちらか( ... )):
    1. から31文字({0,31})oflettersnumbersアンダースコア、および/またはハイフン[a-z0-9_-])、[〜#〜]または[〜#〜]|
    2. 上記のから30の文字plusUSD記号(\$)最後に、次に
  3. これ以上文字pastこのパターン($)。

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

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

13
brent saner