OS X에서 왜 sus ls가 숨겨진 (도트) 파일을 표시합니까?


162

OS X Yosemite에서는 다음 명령을 사용하여 다음을 얻습니다.

$ touch .a
$ touch b
$ /bin/ls
b
$ /bin/ls -A
.a  b
$ sudo /bin/ls
.a  b

루트에 의해 호출 될 때 숨겨진 파일 (점으로 시작하는 이름이 있음)을 표시하고 일반 사용자로 실행할 때 예상대로 표시되지 않습니다. 이것은 ls리눅스 에서 온 것과는 다릅니다 coreutils.

ls이런 식으로 행동합니까?


141
나는 그 태그를 "OSX가 나쁘다"라고 잘못 읽고 정말 혼란스러워했다.
Raystafarian 2016 년

5
태그를 대문자로 허용되는 경우는 덜 혼란 스러울 것입니다 BSDOSX여기에 더 적합합니다.
Ryenus

@Raystafarian은 꽤 웃기 며, 일반적으로 다른 방법이기 때문에 사람들은 태그가있는 문장을 쓰려고합니다.
Braiam

답변:


404

이 기능은 Apple 전용이 아닙니다. 이것은 일반적으로 BSD 시스템의 기능입니다.

/* Root is -A automatically. */
if (!getuid())
    f_listdot = 1;

처음에는 4.4BSD-Lite 소스로 추적 할 수있었습니다 . 1994 년 부터이 FreeBSD 커밋 에 이미 존재 했으며이 소스를 가져오고 있습니다.

이 기능은 또한 오픈 BSD에 존재하며에서 찾아 볼 수있다 이 커밋 NetBSD의에서 코드를 가져올 수 있다고 주장 1995 년부터, 그래서 이것은 이미 존재 NetBSD에 .

그런 다음 1993 년부터 386BSD 에서 코드를 가져오고 있다고 주장하는 NetBSD의 커밋을 발견했으며 그 기능은 이미 존재 합니다. 또한, 이 커밋 은 1991 년 386BSD 버전 0.0을 개발하는 동안 BSD에서 4.3으로 분기 된 것으로 나타났습니다.

주석은의 개발 과정에서 처음 등장 4.3BSD-리노 에서 이 커밋 "처음으로 새로운 LS의 버전을 작업"이라는 제목 (1989년 6월 27일). 원래 의견은 다음과 같이 말했습니다.

/* root sees all files automatically */

이는 한 후에 그 날 변경 (필자는 타임 스탬프는하지만,이 저장소에서 완전히 정확한지 확실하지 않다)로를 :

/* root is -A automatically */

그리고 1992 년에 대문자와 마침표 가 추가 되어 주석을 현재 상태로 바꿉니다.

/* Root is -A automatically. */

그러나이 스냅 샷 에서 볼 수 있듯이이 동작은 1979 년 5 월 9 일 현재 2BSD에 존재했습니다 .

Aflg = getuid() == 0;

나는 그 시간에서 실제 역사를 찾을 수 없습니다뿐만 아니라이 이 스냅 샷 1977 1BSD의 없이 그 라인은. 그리고 -A실제로 깃발이 없습니다.

따라서이 기능은 1977 년 11 월 (현재 개발중인 1BSD)과 1979 년 5 월 2BSD 릴리스 사이에 소개 된 것으로 보입니다.


이 조사 과정에서 발견 한 것은 2005 년 FreeBSD에 추가 되어이 동작을 무시 하고 조금 후에 재 작업 된-I 플래그입니다 .


52
또한,로 시작하여 파일을 숨기는의 "기능"고 지적 가치가있을 수도 있습니다 .단순한 버그했다 - ls단지 숨길했는데 .모든 것이 시작으로, 디렉토리 .. 수십 년을 앞당기 고 일반적으로 위험한 파일 등을 숨기고 시스템 구성 등을 숨기는 데 사용됩니다. 따라서 관리자가 해당 파일을 볼 수 있도록하는 것이 좋습니다 (구성을 유지하거나 숨겨진 악성 코드 찾기 등). .
Luaan

23
Luaan의 의견에 대한 참조 : plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp(Rob Pike에서 "도트 파일"숨기기는 버그로 시작됨)
nibot

2
POSIX 이론에서 "ls 유틸리티의 일부 역사적 구현은 수퍼 유저가 -a 옵션을 지정하지 않고 ls를 호출 할 때 dot 및 dot-dot를 제외한 디렉토리의 모든 항목을 표시합니다."일반 "사용자가 -a를 지정하지 않고 ls를 호출하면 파일 피연산자로 이름이 지정되지 않은 경우 <period>로 시작하는 이름을 가진 파일에 대한 정보를 볼 수 없습니다. " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..

훨씬 오래되었습니다. 마지막으로 SysV 시스템에 액세스했을 때와 동일한 동작이 있었기 때문에 SysV-BSD 분할보다 앞서 있다고 생각합니다.
Joshua

3
서사시 답변. 배운 역사!
Corey Goldberg

15

다음 은 소스 코드에 대한 링크 입니다. 참고 /* Root is -A automatically. */. 이것은 Apple 버전의 BSD 기능입니다 ls.


재미있는 발견. LS를 수행 할 때 숨겨진 파일을 억제하는 방법이 있습니까?
씨 리스터

5
흠, 모양 이 애플 고유의 기능은 아니지만,이 BSD 세계에서 온다?
kirelagin

2
맞습니다. Apple 전용이 아닙니다. 대답 해 주셔서 감사합니다. 올바른 길로 안내했습니다. 나는 Root is -A automatically단서를 찾기 위해 문자열을 사용했습니다 .
kirelagin 2016 년

Mr Lister : 많은 운영 체제 (FreeBSD, 아마도 OS X)에서도 -I (자본 i)를 사용하여 도트 파일을 루트로 표시하지 않도록 할 수 있습니다.
Allan Jude

1

IIRC, 유즈넷 초기 (80 년대 초)에는 이와 관련한 실이있었습니다. 이 기능은 악의적 인 사용자가 sysadmin / root에서 파일 / 디렉토리 / 실행 파일을 쉽게 숨길 수 없도록 보안 예방 조치로 추가되었습니다. 이론은 기본적으로 "루트는 모든 것에 접근 할 수 있으므로 모든 것을 볼 수 있어야한다"는 것이었다.


합리적으로 들립니다 (파일을 도트 파일로 변환하는 것이 의심스러운 방법으로 "숨김"). 그 아카이브를 찾는 것이 좋을 것입니다.
kirelagin 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.