Linux 사용자 이름을 숫자로 시작할 수없는 이유는 무엇입니까?


84

기술적 인 이유가 있습니까? 이것은 Linux 또는 Unix 초기의 유물입니까? 그렇다면 지속되는 이유가 있습니까?


22
이것이 답변에서 논의 되었으므로이 진술의 출처는 무엇입니까?
l0b0

19
@ l0b0 - 당 useradd(에서 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-아, 그리고 하나의 배포판 (이러한 종류의 것으로 유명한)이 "답변에서 디버 킹 되었다"는 의미는 아닙니다 . 질문에 태그 linux가 없습니다 ubuntu. archlinux 에서 해보십시오 .
don_crissti 2016 년

1
@don_crissti 모든 리눅스 배포판에 적용되는 것은 아니므로 , 그 제한이 어디에서 왔는지 아는 것이 흥미로웠다.
l0b0

5
심지어 우분투주의 사항 : Live CD / Ubiquity로 설치할 때 사용자 이름은 "소문자로 시작해야합니다"
43Tesseracts

답변:


136

일부 명령 (예 chown:)은 사용자 이름 또는 숫자 사용자 ID를 허용 할 수 있으므로 모든 숫자 사용자 이름을 허용하면 문제가 발생합니다.

숫자로 시작하고 일부 알파를 포함하는 이름을 허용하는 규칙은 아마도 노력할 가치가없는 것으로 간주되었습니다. 대신 알파 문자로 시작하면됩니다.

편집하다:

다른 반응에서 일부 배포판이이 제한을 무너 뜨린 것으로 보입니다. 이 경우 GNU Core Utils 설명서 에 따르면 :

POSIX에서는 이러한 명령이 먼저 지정된 문자열을 이름으로 확인하려고 시도하고 실패하면 한 번만 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 == 루트 사용자). 그러나 그룹 / 사용자 ID 인수 앞에는 '+'를 붙여서 해석을 정수로 강제 할 수 있습니다.


13
이것은 실제로 질문에 대답하는 유일한 게시물입니다. 당신은 리눅스 배포판에 실행의 결과가 업스트림 코드를 자르다하는 습관이없는 사람 보여주기 위해 예를 추가해야 useradd 253입니다useradd: invalid user name '253'
don_crissti

2
귀하의 게시물에 추가하려는 경우 소스 코드 는 다음과 같습니다 .
don_crissti 2016 년

5
username 1000에 UID 253이 있으면 혼동의 기회를 상상할 수 있습니까? 또는 일반적으로 UID와 일치하지 않는 숫자 사용자 이름의 경우? 물론 그룹과 마찬가지로.
Jonathan Leffler 2016 년

5
일부 사용자가 사용자 이름으로 (숫자) 직원 코드 / 등록 번호를 갖는 LDAP 시스템이 있습니다. 사용자 ID ( chown -R $(id -u $username) ...) 를 정식화하는 방법을 빨리 배웠습니다 .
muru

2
이상적으로는 사용자 이름 문자열 (숫자 또는 문자)이 UID에 매핑되고 이름이 항상 UID를 결정하기 위해 조회됩니다 (이 이름은 숫자로 구성되어 있습니까? 그 다음에 ID로 취급하겠습니다 '
Matt Warren

83

다음은 숫자를 사용하여 우분투 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

하나는 유니 코드 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해당 사용자 에 대한 가치를 사용할 때 다른 유틸리티가 어떻게 반응하는지 알고 있습니다.
Liam Dawson

9
와우 우분투는 그것을 허용합니까? useradd 1000(UID 1000 사용자가 있다고 가정 할 경우 )
thomas_d_j

8
금지 된 모든 기호에 대해서만 +1!
EKons

3
오, 더 나쁘게 생각할 수 있습니다 ...
OrangeDog

4
@IsmaelMiguel : \0/ etc / passwd 의 리터럴 은 아마도 구문 분석하는 많은 프로그램을 중단했을 것입니다. 그러나 표준 도구를 사용하여 처음에는 해당 이름을 가진 사용자를 추가하지 못할 수도 있습니다. 같은 시스템 호출 mkdir(2)도 0으로 끝나는 암시 적 길이 문자열을 사용하므로 /home/\0/경로는 단지이므로 만들 수 없습니다 /home.
Peter Cordes

9

* Nix 사용자 이름은 일반적으로 유틸리티에서 만든 32 자 길이의 문자열입니다 useradd. 이것은 당신이 말했듯이 초기 Unix (BSD 기술적으로) 표준의 직접적인 결과입니다. FreeBSD 매뉴얼 페이지에 따르면 passwd(5):

로그인 이름은 하이픈 (`- ')으로 시작해서는 안되며 8 비트 문자, 탭 또는 공백 또는 다음 기호를 포함 할 수 없습니다.`, : + & # % ^ ()! @ ~ *? <> = | / " '. 달러 기호 (`$')는 Samba와 함께 사용할 마지막 문자로만 사용할 수 있습니다. 사용자가 필드를 구분하기 위해 역사적으로 사용 된 필드에는 콜론 (`: ')이 포함될 수 없습니다. 데이터베이스.

특정 * Nix 시스템은 사용자 이름에 특수 문자가 표시 될 때 모호한 오류를 발생 시키므로 결국 특수 문자가 금지되었습니다. 대부분의 최신 * Nix 시스템에서는 특수 문자 사용자 이름을 지원 하도록 passwd/ useradd유틸리티 를 변경하는 것이 상대적으로 쉽지만 대부분의 사람들은 그다지 중요하지 않은 변경을 주저합니다. 효과가 거의없고 역 호환성이 발생할 수 있기 때문입니다.

편집 :
Adonis가 말했듯이 실제로 현대 Linux 배포판 에서이 작업을 수행 할 수는 있지만 (특히 표준화 된 또는 레거시 프로그램을 만날 때) 바람직하지 않습니다.


5
물론이 질문에는 특수 문자도 언급되어 있지 않습니다. 사용자 이름이 특수 문자가 아닌 숫자로 시작할 수없는 이유를 묻습니다.
don_crissti 2016 년

물론 @don_crissti, 역사적으로 사용자 이름이 공백으로 시작할 수없는 이유를 다시 물어보고 왜 역사적으로 각 기호로 시작하지 않는지 묻고 & c를 역사적으로 $? 이 "답변"은 주석으로는 맞지 않지만, 분명히 질문과 관련된 유용한 정보를 포함하고 있습니다.
frumbert

해당 단락에서 8 비트 문자는 무엇을 의미합니까? IE : 확실히 어떤 ASCII 문자가 8 비트입니까?
매트 워렌

!! /etc/passwd텍스트 파일입니다. useradd? 피쉬-토시. 실제 시스템 관리자가 사용합니다 vi!
infixed

1
@MattWarren. ASCII는 7 비트 인코딩입니다
fpmurphy

1

기술적 인 이유가 있습니까? 이것은 Linux 또는 Unix 초기의 유물입니까? 그렇다면 지속되는 이유가 있습니까?

나는 기술적 인 이유를 생각할 수 없습니다. 역사적으로 ASCII 일뿐입니다. 읽고 입력하는 방법은 코더의 손에 달려 있습니다.

유닉스 역사-레포 /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에 따르면 이메일 "name"을 숫자로 시작하는 데 제한이 없습니다. gmail은 모든 숫자 사용자 이름을 만듭니다. (지금 받아라, 그들은 빨리 가고있다).

따라서 [0-9]로 시작하는 사용자 이름을 거부하는 코드가 있으면 나중에 프로그래머가 "왜 이름을 숫자로 하시겠습니까?"라고 생각하면서 존재하게됩니다. 다시 한 번, 숫자로 시작하는 사용자 이름을 거부하는 역사적인 유닉스 코드가있을 수 있다고 말해야합니다. 나는 그것을 보지 못했다. 초기 암호 테이블은 수작업으로 편집되었으므로 90 년대 초에도 자주 사용하는 것을 기억합니다.

왜 그것이 지속되는 한, 나는 stroustrup, C ++ 11FAQ를 인용 할 것입니다. 새로운 표준 라이브러리는 언제 사용할 수 있습니까?

문제를 더욱 어렵게 만들려면위원회에서 나쁜 점에 동의하더라도 이전 기능을 제거하는 것이 불가능하다는 점을 기억하십시오. 수십 년간.


0

답변에서 지적했듯이 Linux 사용자 이름 모든 숫자 일 있습니다. 그러나 이것은 많은 소프트웨어 도구 (및 사람의 sysadmins!)를 혼동 할 수 있으므로 나쁜 생각입니다.

예를 들어, 모든 숫자의 사용자 이름과 그룹 이름은 RHEL 7에서 더 이상 사용되지 않으며 RHEL 8에서 금지됩니다.

8.7.1. shadow-utils더 이상 모든 숫자의 사용자 및 그룹 이름을 허용하지 않습니다

useraddgroupadd명령은 숫자의 순수로 구성된 사용자 및 그룹 이름을 허용하지. 이러한 이름을 허용하지 않는 이유는 사용자 및 그룹 이름 및 사용자 및 그룹 ID (숫자)와 작동하는 많은 도구를 혼동시킬 수 있기 때문입니다. 모든 숫자의 사용자 및 그룹 이름은 Red Hat Enterprise Linux 7에서 더 이상 사용되지 않으며 Red Hat Enterprise Linux 8에서는 완전히 지원되지 않습니다.


-2

기술적 인 이유라고 생각하지는 않지만 규칙은 "사용자 이름은 유효한 프로그래밍 언어 식별자 여야합니다"로 요약됩니다. 식별자는 구문이 제한되어 있기 때문에 몇 가지 좋은 속성을 가지고 있습니다. 문자별로 문자를 읽을 때도 숫자로 착각 할 수 없으며 파서를 통과 할 때 인용 할 필요가 없습니다. 간단히 말해, 이름으로 쉽게 인식되므로 작업에 필요한 프로그래밍 작업이 줄어 듭니다.

나는 의심 이제까지 초기 유닉스 사용자의 100 % 명확한 결정했을 간단한 규칙입니다 "사용자 이름은 식별자가 있어야합니다"숫자로 시작하는 사용자 이름을 허용 정말 필요하지만.

사용자 이름을 입력 할 수있는 유일한 장소가 GUI의 로그인 프롬프트에있는 경우, 포함하는 문자 (널을 제외하고 줄 바꿈 제외)로 인해 딸꾹질이 발생할 수 있습니다. 그러나 명령 줄에서 많은 작업을 수행하는 경우 작업하기 쉬운 사용자 이름이 편리합니다.


로그인 (사용자 이름)은 프로그래밍 언어 식별자와 전혀 관련이 없습니다.
fpmurphy

그리고 아직 유효한 사용자 이름의 정의 이며 그 요점, 식별자와 동일합니다.
Alexis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.