Linuxユーザー名が数字で始まらないのはなぜですか?


84

技術的な理由はありますか?これは初期のLinuxまたはUnixのアーティファクトですか?もしそうなら、それが持続する理由はありますか?


22
これは答えで暴かれたので、この声明の出典は何ですか?
-l0b0

19
@ l0b0- useradd(from shadow-utils 4.2.1)マニュアルページごと(警告を参照):Usernames must start with a lower case letter or an underscore [...] In regular expression terms: [a-z_][a-z0-9_-]*[$]?
don_crissti

30
@ l0b0-ああ、1つのディストリビューション(この種のことで有名)がそれを許可しているからといって、「答えが暴かれた」という意味ではありません。質問にはタグが付いてlinuxubuntuますが、タグは付いていません。archlinuxで試してみてください。
don_crissti

1
@don_crissti これは明らかにすべての Linuxディストリビューションに適用されるわけではないため、その制限がどこから来るのかを知ることは興味深いものでした。
-l0b0

5
Ubuntuでも気にかけます:Live CD / Ubiquityでインストールする場合、ユーザー名は「小文字で始める必要があります」
-43Tesseracts

回答:


136

一部のコマンド(などchown)は、ユーザー名または数値のユーザーIDのいずれかを受け入れることができるため、すべて数値のユーザー名を許可すると、それが壊れます。

数字で始まり、アルファを含む名前を許可するルールは、おそらく努力する価値がないと考えられていました。代わりに、アルファ文字で始まるという要件があります。

編集:

他の回答から、一部のディストリビューションがこの制限を覆しているようです。この場合、GNU Core Utilsのドキュメントによると:

POSIXでは、これらのコマンドが最初に指定された文字列を名前として解決しようとし、それが1回失敗した後、IDとして解釈することを要求します。

$ useradd 1000   # on most systems this will fail with:
                 # useradd: invalid user name '1000'
$ mkdir /home/1000
$ chown -R 1000 /home/1000   # This will first try to map
    # to username "1000", but this may easily be misinterpreted.

「0」という名前のユーザーを追加すると、トラブルが発生します(UID 0 == rootユーザー)。ただし、グループ/ユーザーID引数の前に '+'を付けて、整数として解釈するように強制できることに注意してください。


13
これは、実際に質問に答える唯一の投稿です。あなたがLinuxディストリビューション上で実行した結果は、上流のコード不具する習慣を持っていない人を示すために例を追加しなければならないuseradd 253ですがuseradd: invalid user name '253'
don_crissti

2
あなたの投稿に追加したい場合、ここのレコードはソースコードです。
-don_crissti

5
ユーザー名1000にUID 253がある場合、混乱の可能性を想像できますか?または、一般的に、UIDと一致しない数値のユーザー名の場合 もちろんグループでも同様です。
ジョナサンレフラー

5
一部のユーザーが(数字の)従業員コード/登録番号をユーザー名として持っているLDAPシステムがあります。ユーザーIDに正規化することをすぐに学びました(chown -R $(id -u $username) ...)。
ムル

2
理想的には、数字または文字に関係なく、ユーザー名文字列はUIDにマッピングされ、名前は常にUIDを決定するためにルックアップされますが、この名前は数字で作られていますか?それから私はそれをIDとして扱います」
マット・ウォーレン

83

ここに数字を使用したubuntu 14.04のテストがあります:

root@ubuntu:~# useradd 232
root@ubuntu:~# mkdir /home/232
root@ubuntu:~# chown 232.232 /home/232
root@ubuntu:~# passwd 232
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@ubuntu:~# login
c2 login: 232
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 2.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.


$ 
$ whoami
232

そして、Unicode U + 1F600を使用するもの-😀

root@c2:~# useradd 😀
root@c2:~# mkdir /home/😀
root@c2:~# chown 😀.😀 /home/😀
root@c2:~# passwd 😀
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@c2:~# login
c2 login: 😀
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 2.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

$ whoami
😀

これはおそらく私が持っていた最悪のアイデアです:

root@c2:~# useradd '&#%^()!@~*?<>=|'
root@c2:~# passwd '&#%^()!@~*?<>=|'
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@c2:~# mkdir '/home/&#%^()!@~*?<>=|'
root@c2:~# chown '&#%^()!@~*?<>=|.&#%^()!@~*?<>=|' '/home/&#%^()!@~*?<>=|'
root@c2:~# login
c2 login: &#%^()!@~*?<>=|     
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)
**** text removed ****
applicable law.

$ whoami
&#%^()!@~*?<>=|

明らかに、このようなユーザーを追加できますが、長期的にはこれが良い考えかどうかはわかりません。


1
useradd '*'楽しいcd /home/*/だろう- 期待どおりに動作せず$HOME、そのユーザーのの値を使用したときに他のユーティリティがどのように反応するかを知っている人。
リアムドーソン

9
うわーubuntuはそれを許可しますか?useradd 1000(UID 1000のユーザーが既にいると仮定して)
-thomas_d_j

8
禁止されているすべてのシンボルに対してのみ+1!
-EKons

3
ああ、もっと悪いことを考えることができます...
OrangeDog

4
@IsmaelMiguel:\0/ etc / passwdのリテラルは、おそらくそれを解析する多くのプログラムを壊すでしょう。ただし、標準ツールを使用して、そもそもその名前のユーザーを追加することはできません。のようなシステムコールmkdir(2)も0で終わる暗黙の長さの文字列を使用する/home/\0/ため、そのパスはであるため、作成できません/home
ピーターコーデス

9

* Nixユーザー名は通常、ユーティリティによって作成される32文字の長い文字列ですuseradd。あなたが言ったように、これは初期のUnix(技術的にはBSD)標準の直接的な結果です。FreeBSDのマンページによるとpasswd(5)

ログイン名はハイフン( `-')で始まってはならず、8ビット文字、タブ、スペース、またはこれらの記号を含めることはできません:`、:+&#%^()!@〜*?<> = | / "'。ドル記号(` $')は、Sambaで使用する最後の文字としてのみ使用できます。これは、ユーザーのフィールドを区切るために歴史的に使用されているため、コロン( `: ')を含むフィールドはありませんデータベース。

特定の* Nixシステムでは、ユーザー名に特殊文字が含まれていると不明瞭なエラーがスローされていたため、最終的には特殊文字が禁止されました。最新の* Nixシステムでは、特殊文字のユーザー名をサポートするためにpasswd/ useraddユーティリティを比較的簡単に変更できますが、ほとんどの人はそのような重要でないものを変更することをためらっています。

編集:
アドニスが言ったように、実際にはこれを現代のLinuxディストリビューションで行うことは可能ですが、賢明ではありません(特に標準化されたプログラムやレガシープログラムに遭遇した場合)。


5
確かに、質問では特殊文字についても言及していません。ユーザー名が数字(特殊文字ではない)で開始できない理由を尋ねます。
don_crissti

確かに@don_crissti、歴史的にユーザー名がスペースで始まらない理由を再質問し、それが歴史的に各記号で始まっていない理由を個別に尋ね、次に歴史的に$で終わることを尋ねますか?この「回答」はコメントとしては当てはまりませんが、明らかにそうですが、質問に関連する有用な情報が含まれています。
フルンバート

その段落の8ビット文字とはどういう意味ですか?IE:確かにアスキー文字は8ビットですか?
マットウォーレン

フェ! /etc/passwdテキストファイルです。 useradd?小魚。実際のシステム管理者が使用しますvi
19:44に固定された

1
@MattWarren。ASCIIは7ビットエンコーディングです
fpmurphy

1

技術的な理由はありますか?これは初期のLinuxまたはUnixのアーティファクトですか?もしそうなら、それが持続する理由はありますか?

技術的な理由を考えることはできません-歴史的に、それは単なるASCIIです。どのように読み込まれ、次に入力されるかは、コーダーの手にかかっています。

unix-history-repo / usr / src / cmd / passwd.c

char *uname;

insist = 0;
if(argc < 2) {
    if ((uname = getlogin()) == NULL) {
        printf ("Usage: passwd user\n");
        goto bex;
    } else {
        printf("Changing password for %s\n", uname);
    }
} else {
    uname = argv[1];
}

アーカイブのマニュアルページを閲覧するのにしばらく時間を費やしてきたので(たとえば: 1BSDはBill Joyの最初のBerkeley Software Distributionでした)、ユーザー名を指定するものは何も見ませんでした。それは存在しないと言うことではありませんが、私はそれを見ていません。

したがって、私たちは歴史的な人間の文脈に取り残されています。1980年に技術を始めたとき、ログインには常に本名を使用していました。通常、長さの制限がない限り、最初のイニシャルと最後のフルネーム。ログイン名がメールアドレスとして使用されたため、これは重要でした。当時、誰も匿名のメールを送信していませんでした。もちろん、いくつかの例外があったに違いありません、私はそれらを思い出しません。しかし、全体としては、これが事実であると信じています。

また、rfc5321#page-63によると、電子メールの「名前」が数字で始まることに制限はありません。gmailはすべての数値のユーザー名を作成します。(今すぐ入手、彼らは速くなっています)。

したがって、[0-9]で始まるユーザー名を拒否するコードがある場合、「名前として数字を使用する理由は何ですか?」繰り返しになりますが、数字で始まるユーザー名を拒否する歴史的なUNIXコードが存在する可能性が非常に高いと言わざるを得ません。まだ見ていません。初期のパスワードテーブルは手動で編集されたもので、90年代初頭であっても頻繁にそれを行ったことを確かに覚えています。

なぜそれが続くのかについては、stroustrup、C ++ 11FAQ、新しい標準ライブラリはいつ利用可能になるのでしょうか?

問題をより困難にするために、委員会が悪いことに同意したとしても、古い機能を削除することは実行不可能であることを覚えておいてください:経験は、ユーザーがすべての実装者に互換性スイッチ(またはデフォルトで)で廃止され禁止された機能を提供し続けることを強制することを示しています何十年もの間。


0

回答で指摘したように、Linuxユーザー名すべて数字にすることできます。ただし、多くのソフトウェアツール(および人間のシステム管理者)を混乱させるため、これは悪い考えです。

このため、たとえば、すべて数字のユーザー名とグループ名はRHEL 7では廃止され、RHEL 8では禁止されています。

8.7.1。shadow-utilsすべて数字のユーザー名とグループ名を許可しなくなりました

useraddそしてgroupaddコマンドは、数字だけからなるユーザー名とグループ名を禁止します。そのような名前を許可しない理由は、ユーザー名とグループ名、およびユーザーIDとグループID(数字)を扱う多くのツールを混乱させる可能性があるためです。Red Hat Enterprise Linux 7ではすべて数字のユーザー名とグループ名が廃止され、それらのサポートはRed Hat Enterprise Linux 8では完全に削除されることに注意してください。


-2

それを技術的な理由と呼ぶかどうかはわかりませんが、ルールは「ユーザー名は有効なプログラミング言語の識別子でなければなりません」に要約されます。識別子には制限された構文があるため、いくつかの便利なプロパティがあります。文字ごとに文字を読み取っても数字と間違えられず、パーサーを通過するときに引用符で囲む必要はありません。要するに、それらは名前として簡単に認識されるため、それらを操作するために必要なプログラミング作業が軽減されます。

数字で始まるユーザー名を禁止することは本当に必要だったのではない思いますが、「ユーザー名は識別子でなければなりません」は、初期のUnixユーザーの100%にとっては明らかな単純なルールです。

ユーザー名を入力する唯一の場所がGUIのログインプロンプトにある場合、おそらくどの文字が含まれているかに違いはありません(ヌルや改行のようなものを除外します。ただし、コマンドラインから多くの作業を行う場合は、使いやすいユーザー名を使用すると便利です。


ログイン(ユーザー名)は、プログラミング言語の識別子とはまったく関係ありません。
fpmurphy

そして、まだ有効なユーザ名の定義があることがポイントだ、識別子と同じ。
アレクシス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.