ls *.* 给出:“*.*:没有这样的文件或目录”消息

ls *.* 给出:“*.*:没有这样的文件或目录”消息

我正在使用 Linux 应用程序服务器 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2+deb7u2 x86_64 GNU/Linux。当我进入包含多个名为name1.phpname1.htmlname2.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) 分别具有rwxr-x。但请注意,其他权限仅设置为--x.

这意味着您可以执行此目录中的命令,但无法读取或执行此目录内容的列表。

您的场景

当您在此目录中www-data运行命令时,您是其他用户(不是)。sudo我们称这个用户为 UserX。

当 shell 以 UserX 身份调用此命令时:

$ sudo ls *.*

并返回:

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

UserX 的 shell 尝试将 展开*.*为任何文件,但由于 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

调用 shell 并用单引号保护 的扩展*可以获得您想要的:

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

答案2

这应该有效:

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

相关内容