ls *.*는 "*.*: 해당 파일이나 디렉터리가 없습니다"라는 메시지를 제공합니다.

ls *.*는 "*.*: 해당 파일이나 디렉터리가 없습니다"라는 메시지를 제공합니다.

저는 Linux Application Server 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2+deb7u2 x86_64 GNU/Linux를 사용하고 있습니다. name1.php, name1.html, 등이라는 이름의 여러 파일이 포함된 name2.php디렉토리 로 이동하여 다음을 입력합니다.

$ sudo ls *.*

나는 얻다:

ls: cannot access *.*: No such file or directory

나는 같은 문제를 가지고있다 grep:

$ grep "TOS.html" *.*
grep: *.*: No such file or directory

왜 그런 겁니까? 이 문제를 어떻게 해결할 수 있나요?

편집 #1:

$ shopt | grep glob
+ grep glob
+ shopt
dotglob         off
extglob         on
failglob        off
globstar        off
nocaseglob      off
nullglob        off

편집 #2:

$ ls -ld;echo --;sudo ls -ld 
+ ls --color=auto -ld
drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .
+ echo --
--
+ sudo ls -ld
drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .

답변1

배경

귀하의 문제는 궁극적으로 디렉토리에 대한 다음 권한으로 인해 발생한다고 생각합니다.

drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .

소유자( www-data)와 그룹( root) 에는 각각 rwx및 가 있습니다 r-x. 하지만 다른 권한은 으로만 설정되어 있으니 참고하세요 --x.

즉, 이 디렉터리에서 명령을 실행할 수 있지만 이 디렉터리의 내용 목록을 읽거나 실행할 수는 없습니다.

당신의 시나리오

이 디렉터리에서 명령을 실행하면 www-data다른 사용자가 됩니다. sudo이 사용자를 UserX라고 부르겠습니다.

쉘이 이 명령을 UserX로 호출하는 경우:

$ sudo ls *.*

그리고 다음을 반환합니다:

ls: cannot access *.*: No such file or directory

UserX의 셸은 모든 파일로 확장을 시도 *.*하지만 UserX는 이 디렉터리의 내용을 읽을 수 없으므로 아무것도 반환하지 않습니다. 그런 다음 이름이 어떤 텍스트 파일과도 일치할 수 없는 *.*텍스트를 보냅니다 .sudo ls *.**.*

명령 을 실행하려고 하면 grep동일한 문제가 발생합니다 . 마찬가지로 UserX는 어떤 파일도 읽을 수 없으므로 grep텍스트 파일을 검색하도록 지시 *.*하지만 해당 이름의 파일을 찾을 수 없습니다. 따라서 메시지는 다음과 같습니다.

접근 불가.: 해당 파일이나 디렉터리가 없습니다.

그리고

.: 해당 파일이나 디렉터리가 없습니다.

귀하와 마찬가지로 다음과 같은 설정이 있다고 가정해 보겠습니다.

$ sudo chown nginx.root /tmp/afolder
$ sudo chmod 751 /tmp/afolder/
$ sudo ls -ld /tmp/afolder/
drwxr-x--x 2 nginx root 4096 Nov 23 04:10 /tmp/afolder/
$ sudo touch /tmp/afolder/fakefile.txt

이제 내 경우에는 "UserX"로 만들어 보겠습니다 saml.

$ id
uid=500(saml) gid=501(saml) groups=501(saml)

다음 디렉토리로 CD를 이동할 수 있습니다.

$ pwd
/tmp/afolder

하지만 해당 디렉토리의 파일을 나열하려고 하면 다음과 같습니다.

$ ls *
ls: cannot access *: No such file or directory

같은 질문 sudo:

$ sudo ls -l *.*
ls: cannot access *.*: No such file or directory

작은따옴표로 보호된 확장을 사용하여 셸을 호출하면 *원하는 결과를 얻을 수 있습니다.

$ sudo bash -c 'ls -l *.*'
-rw-r--r-- 1 root root 0 Nov 23 04:14 fakefile.txt

답변2

이것은 작동합니다:

sudo sh -c 'ls -l *.*'

관련 정보