我正在使用 Linux 应用程序服务器 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。
当 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 *.*'