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

Ota*_*our 18 ls sudo wildcards

我正在使用 Linux 应用服务器 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2+deb7u2 x86_64 GNU/Linux。当我去到一个目录名为几个文件name1.phpname1.htmlname2.php等和类型:

$ sudo ls *.*
Run Code Online (Sandbox Code Playgroud)

我得到:

ls: cannot access *.*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我有同样的问题grep

$ grep "TOS.html" *.*
grep: *.*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我该如何解决这个问题?

编辑#1:

$ shopt | grep glob
+ grep glob
+ shopt
dotglob         off
extglob         on
failglob        off
globstar        off
nocaseglob      off
nullglob        off
Run Code Online (Sandbox Code Playgroud)

编辑#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 .
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 17

背景

我认为您的问题最终是因为该目录的这些权限:

drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .
Run Code Online (Sandbox Code Playgroud)

请注意,所有者 ( www-data) 和组 ( root)分别具有rwxr-x。但是请注意,其他权限设置为 just --x

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

你的场景

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

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

$ sudo ls *.*
Run Code Online (Sandbox Code Playgroud)

并返回:

ls: cannot access *.*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在让我们成为“UserX”,就我而言,它是saml

$ id
uid=500(saml) gid=501(saml) groups=501(saml)
Run Code Online (Sandbox Code Playgroud)

我可以 cd 进入目录:

$ pwd
/tmp/afolder
Run Code Online (Sandbox Code Playgroud)

但是当我尝试列出此目录中的文件时:

$ ls *
ls: cannot access *: No such file or directory
Run Code Online (Sandbox Code Playgroud)

同样的问题sudo

$ sudo ls -l *.*
ls: cannot access *.*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

$ sudo bash -c 'ls -l *.*'
-rw-r--r-- 1 root root 0 Nov 23 04:14 fakefile.txt
Run Code Online (Sandbox Code Playgroud)


jll*_*gre 7

这应该有效:

sudo sh -c 'ls -l *.*'
Run Code Online (Sandbox Code Playgroud)