Mengapa nama pengguna Linux tidak bisa dimulai dengan angka?

84

Apakah ada alasan teknis mengapa? Apakah ini merupakan artefak dari masa-masa awal Linux atau Unix, dan jika demikian apakah ada alasan mengapa hal itu tetap ada?

43Tesaksi
sumber
22
Karena ini dibantah dalam jawaban, apa sumber Anda untuk pernyataan ini?
l0b0
19
@ l0b0 - per useradd(dari shadow-utils 4.2.1) halaman buku panduan (lihat CAVEATS ):Usernames must start with a lower case letter or an underscore [...] In regular expression terms: [a-z_][a-z0-9_-]*[$]?
don_crissti
30
@ l0b0 - oh, dan hanya karena satu distro (terkenal karena hal-hal semacam ini) memungkinkan itu tidak berarti "itu dibantah dalam jawaban" . Pertanyaannya ditandai linux, bukan ubuntu. Coba lakukan di archlinux .
don_crissti
1
@don_crissti Jelas tidak berlaku untuk semua distro Linux, dan karena itu menarik untuk mengetahui dari mana batasan itu berasal.
l0b0
5
Bahkan Ubuntu peduli: ketika Anda menginstal dengan Live CD / Ubiquity nama pengguna Anda "Harus mulai dengan huruf kecil"
43Tesseracts

Jawaban:

136

Beberapa perintah (mis. chown) Dapat menerima nama pengguna atau ID pengguna numerik, sehingga mengizinkan semua nama pengguna numerik akan memecahnya.

Aturan untuk mengizinkan nama yang dimulai dengan angka dan mengandung beberapa alpha mungkin dianggap tidak sepadan dengan usaha; alih-alih hanya ada persyaratan untuk memulai dengan karakter alfa.

Sunting:

Tampaknya dari tanggapan lain bahwa beberapa distro telah menumbangkan batasan ini; dalam hal ini, menurut dokumentasi GNU Core Utils :

POSIX mensyaratkan bahwa perintah-perintah ini pertama-tama mencoba untuk menyelesaikan string yang ditentukan sebagai nama, dan hanya sekali yang gagal, kemudian mencoba menafsirkannya sebagai 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.

Menambahkan pengguna bernama '0' hanya akan meminta masalah (UID 0 == pengguna root). Namun, perhatikan bahwa argumen ID pengguna / grup dapat didahului oleh '+' untuk memaksa interpretasi mereka sebagai integer.

thomas_d_j
sumber
13
Ini adalah satu-satunya posting yang benar-benar menjawab pertanyaan. Anda harus menambahkan contoh untuk menunjukkan kepada orang-orang bahwa pada distro linux yang tidak memiliki kebiasaan untuk memutilasi kode hulu hasil dari menjalankannya useradd 253adalahuseradd: invalid user name '253'
don_crissti
2
Untuk catatan di sini adalah kode sumber jika Anda ingin menambahkannya ke posting Anda.
don_crissti
5
Bisakah Anda bayangkan peluang untuk kebingungan jika nama pengguna 1000 memiliki UID 253? Atau, secara umum, untuk nama pengguna numerik yang tidak cocok dengan UID? Sama dengan kelompok, tentu saja.
Jonathan Leffler
5
Saya memiliki sistem LDAP di mana beberapa pengguna memiliki kode / nomor pendaftaran karyawan (angka) sebagai nama pengguna. Saya dengan cepat belajar untuk mengkanoniskan ke ID pengguna ( chown -R $(id -u $username) ...).
muru
2
idealnya string nama pengguna, apakah angka atau huruf, akan dipetakan ke UID dan nama selalu mencari untuk menentukan UID, sebagai lawan dari malas 'apakah nama ini terbuat dari angka? maka saya akan memperlakukannya sebagai ID '
Matt Warren
83

di sini ada tes di ubuntu 14.04 menggunakan angka:

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

dan satu menggunakan 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
😀

Ini mungkin ide terburuk yang saya miliki:

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
&#%^()!@~*?<>=|

Jelas Anda dapat menambahkan pengguna seperti itu, meskipun saya tidak yakin ini adalah ide yang bagus dalam jangka panjang.

adonis
sumber
1
useradd '*'akan menyenangkan - cd /home/*/tidak akan berfungsi seperti yang diharapkan, dan siapa yang tahu bagaimana utilitas lain akan bereaksi ketika menggunakan nilai $HOMEuntuk pengguna itu.
Liam Dawson
9
wow ubuntu mengizinkannya? Saya bertanya-tanya apa yang terjadi jika Anda mencoba useradd 1000(dengan asumsi Anda sudah memiliki pengguna dengan UID 1000)
thomas_d_j
8
+1 hanya untuk semua simbol terlarang!
EKons
3
Oh, aku bisa memikirkan yang lebih buruk ...
OrangeDog
4
@IsmaelMiguel: Sebuah literal \0di / etc / passwd mungkin akan merusak banyak program yang menguraikannya. Tapi Anda mungkin tidak bisa menambahkan pengguna dengan nama itu di tempat pertama, menggunakan alat standar. Panggilan sistem seperti mkdir(2)juga menggunakan 0-dihentikan string implisit, jadi Anda tidak dapat membuat /home/\0/, karena jalur itu adil /home.
Peter Cordes
9

Nama pengguna * Nix umumnya adalah string panjang 32 karakter yang dibuat oleh utilitas useradd. Ini, seperti yang Anda katakan, merupakan akibat langsung dari standar Unix (BSD secara teknis) awal. Menurut FreeBSD Man Page passwd(5):

Nama login tidak boleh dimulai dengan tanda hubung (`- '), dan tidak boleh berisi karakter 8-bit, tab atau spasi, atau simbol-simbol ini:`,: + & #% ^ ()! @ ~ *? <> = | / "'. Simbol dolar (` $') hanya diperbolehkan sebagai karakter terakhir untuk digunakan dengan Samba. Tidak ada bidang yang dapat mengandung titik dua (`: ') karena ini telah digunakan secara historis untuk memisahkan bidang dalam pengguna basis data.

Sistem * Nix tertentu digunakan untuk melempar kesalahan yang tidak jelas ketika disajikan dengan karakter khusus dalam nama pengguna, jadi pada akhirnya, karakter khusus tersebut dilarang. Dalam kebanyakan * sistem Nix modern yang akan relatif mudah untuk mengubah passwd/ useraddutilitas untuk mendukung username karakter khusus, tetapi kebanyakan orang ragu-ragu untuk mengubah hal yang tidak penting seperti, karena akan memiliki pengaruh yang kecil dan akan menyebabkan mundur ketidakcocokan.

EDIT:
Seperti yang dikatakan Adonis, sebenarnya mungkin untuk melakukan ini dalam distribusi Linux modern, namun itu keliru (terutama ketika menghadapi program standar atau lawas).

Menarik...
sumber
5
Tentu tetapi pertanyaannya bahkan tidak menyebutkan karakter khusus. Ia bertanya mengapa nama pengguna tidak dapat mulai dengan angka (yang bukan karakter khusus).
don_crissti
Tentu @don_crissti, apakah Anda ingin saya bertanya kembali mengapa secara historis nama pengguna tidak dapat memulai dengan spasi, lalu tanyakan secara terpisah mengapa secara historis tidak dimulai dengan masing-masing simbol, lalu tanyakan & c secara historis diakhiri dengan $? "Jawaban" ini tidak cocok sebagai komentar, yang jelas, namun berisi informasi bermanfaat yang terkait dengan pertanyaan tersebut.
frumbert
Apa yang dimaksud dengan karakter 8-bit dalam paragraf itu? IE: Tentunya karakter ascii 8-bit?
Matt Warren
feh! /etc/passwdadalah file teks. useradd? omong kosong Penggunaan sysadmin nyata vi!
diinfiks
1
@MattWarren. ASCII adalah penyandian 7-bit
fpmurphy
1

Apakah ada alasan teknis mengapa? Apakah ini merupakan artefak dari masa-masa awal Linux atau Unix, dan jika demikian apakah ada alasan mengapa hal itu tetap ada?

Saya tidak bisa memikirkan alasan teknis - secara historis, itu hanya ASCII. Cara membaca dan mengetik di tangan pembuat kode.

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];
}

Karena saya telah menghabiskan beberapa waktu menjelajahi halaman manual arsip (misalnya: 1BSD adalah Distribusi Perangkat Lunak Berkeley pertama dari Bill Joy ), saya tidak melihat apa pun yang menentukan nama pengguna. Itu bukan untuk mengatakan bahwa itu tidak ada, tetapi saya belum melihatnya.

Jadi kita dibiarkan dengan konteks sejarah manusia. Kembali ketika saya mulai dalam teknologi pada tahun 1980, kami selalu menggunakan nama asli kami untuk login. Biasanya nama depan dan belakang nama depan kecuali ada batas panjang. Ini penting karena nama login Anda digunakan sebagai alamat email Anda. Tak seorang pun saat itu mengirim email yang anonim. Tentu saja ada beberapa pengecualian, saya tidak ingat mereka. Namun secara keseluruhan, saya percaya ini yang terjadi.

Dan menurut rfc5321 # page-63, tidak ada batasan untuk memiliki "nama" email dimulai dengan numerik. gmail akan membuat semua nama pengguna numerik. (dapatkan sekarang, mereka akan cepat).

Jadi jika ada kode yang menolak nama pengguna yang diawali dengan [0-9], maka mungkin akan muncul kemudian dengan beberapa programmer berpikir "mengapa Anda memiliki nomor sebagai nama?". Sekali lagi, saya harus mengatakan bahwa mungkin ada kode unix bersejarah yang menolak nama pengguna yang dimulai dengan angka. Aku belum melihatnya. Tabel kata sandi awal diedit dengan tangan, saya tentu ingat sering melakukan itu, bahkan di awal tahun 90an.

Sejauh mengapa ini bertahan, saya akan mengutip stroustrup, C ++ 11FAQ, Kapan perpustakaan standar baru akan tersedia?

Untuk membuat masalah lebih sulit, ingatlah bahwa tidak layak untuk menghilangkan fitur yang lebih tua, bahkan jika komite setuju bahwa mereka buruk: pengalaman menunjukkan bahwa pengguna memaksa setiap pelaksana untuk terus menyediakan fitur-fitur usang dan terlarang di bawah sakelar kompatibilitas (atau secara default) selama beberapa dekade.

Jim
sumber
0

Seperti yang ditunjukkan dalam jawaban, nama pengguna Linux bisa semua-numerik. Namun, ini adalah Ide Buruk karena akan membingungkan banyak perangkat lunak (dan sysadmin manusia!).

Karena alasan ini, misalnya, nama pengguna dan nama grup semua-numerik tidak digunakan lagi dalam RHEL 7 dan dilarang di RHEL 8:

8.7.1. shadow-utilstidak lagi mengizinkan semua pengguna numerik dan nama grup

The useradddan groupaddperintah melarang nama pengguna dan grup yang terdiri murni dari karakter numerik. Alasan untuk tidak mengizinkan nama-nama tersebut adalah karena hal ini dapat membingungkan banyak alat yang berfungsi dengan nama pengguna dan grup serta id pengguna dan grup (yang merupakan angka). Harap dicatat bahwa semua nama pengguna dan grup numerik sudah tidak digunakan lagi di Red Hat Enterprise Linux 7 dan dukungan mereka sepenuhnya dihapus di Red Hat Enterprise Linux 8.

dr01
sumber
-2

Saya tidak yakin saya akan menyebutnya sebagai alasan teknis, tetapi aturannya bermuara pada "nama pengguna harus merupakan pengidentifikasi bahasa pemrograman yang valid". Pengidentifikasi memiliki beberapa sifat yang bagus karena sintaks terbatas mereka: Mereka tidak dapat disalahartikan sebagai angka, bahkan ketika membaca karakter berdasarkan karakter, dan mereka tidak perlu dikutip ketika melalui pengurai. Singkatnya, mereka mudah dikenali sebagai nama, yang mengurangi pekerjaan pemrograman yang diperlukan untuk bekerja dengannya.

Saya ragu itu pernah benar-benar diperlukan untuk melarang nama pengguna yang dimulai dengan digit, tapi "username harus menjadi pengenal" adalah aturan sederhana yang akan jelas ke 100% dari awal pengguna Unix.

Jika satu-satunya tempat Anda mengetikkan nama pengguna Anda adalah pada prompt login di GUI, mungkin tidak ada bedanya karakter apa yang disertakan (kecuali null dan hal-hal seperti baris baru, yang bahkan akan memberikan prosedur masuk cegukan). Tetapi jika Anda melakukan banyak pekerjaan dari commandline, kenyamanan memiliki nama pengguna yang mudah digunakan.

alexis
sumber
Humm, login (nama pengguna) sama sekali tidak ada hubungannya dengan pengidentifikasi bahasa pemrograman.
fpmurphy
Namun definisi nama pengguna yang valid adalah sama seperti untuk pengidentifikasi, itu intinya.
alexis