为什么“ls -a”会向 root 用户隐藏一些现有目录?

为什么“ls -a”会向 root 用户隐藏一些现有目录?

今天我在我们的一台测试服务器上发现了一些非常有趣的东西(至少对我来说):

我可以使用相对路径从我的实际工作目录更改到现有目录,但是使用时不会列出该目录ls -a

这里是 shell 会话(如root):

$ pwd
/you/are/here
$ ls -a
. ..                       <-- Note: "somedir" is not shown to root
$ echo $CDPATH

$ cd somedir               <-- But still: "cd" works fine
$ pwd
/you/are/here/somedir
$ cd ..
$ pwd
/you/are/here
$ ls -a
. ..

有人能告诉我,这怎么可能?我已经检查过了:ls是来自/bin/ls, 是pwd/bin/pwd都来自其原始包装(我的意思是:没有被黑客入侵)。

/you是已安装的 EMC 磁盘(ext3)。并且somedir存在,我可以列出它的内容(有几个子目录、文件)。它的名称不是以点开头的。

更多 shell 会话,包含有关命令和ls输出的更多信息:

root@U-TEST@AT$/bin/ls -ali
total 4
16515074 drwxrwxr-x  2 U8000966 test 2048 Sep  1 07:39 .
16515073 drwxrwxr-x  3 U8000966 test 2048 Apr 27  2006 ..
root@U-TEST@AT$ls -ali somewhere | head -5
total 182
16515075 drwxrwxr-x  43 U8000966 test  2048 Sep  1 07:39 .
16515074 drwxrwxr-x   2 U8000966 test  2048 Sep  1 07:39 ..
16519169 drwxrwxrwx   4 U8000966 test  2048 Jul 25  2007 AAA
16515124 drwxrwxr-x   3 U8000966 test  2048 May 12  2006 BBB
root@U-TEST@AT$type ls
ls is aliased to `/bin/ls $LS_OPTIONS'
root@U-TEST@AT$type pwd
pwd is a shell builtin
root@U-TEST@AT$/bin/pwd
/you/are/here
root@U-TEST@AT$cd somewhere
root@U-TEST@AT$/bin/pwd
/you/are/here/somewhere
root@U-TEST@AT$type cd
cd is a shell builtin

请注意共 4在第一个之后ls -ali。(我不知道这是否相关......)

更多测试:

root@UR-TEST@AT$ls
.  ..
root@U-TEST@AT$touch somewhere/testfile
root@U-TEST@AT$ls
.  ..
root@U-TEST@AT$cp somewhere/testfile ./
root@U-TEST@AT$ls
.  ..  testfile
root@U-TEST@AT$du .
2       .
root@URBIS-TEST@AT$

EMC 是:http://www.emc.com/products/family/disk-library-family.htm,但在这种情况下他们只是一个磁盘提供商,拥有硬盘,格式为 ext3。

更新

(抱歉,昨天我不得不离开)

我确实检查了echo *,它的输出是:. ..。以下是LS_OPTIONS-a -N --color=tty -T 0

我检查了 Gilles 提到的自动挂载功能,但当我更改为somewhere并发布时,mount|grep somewhere没有任何输出。

以下是建议的输出lsattrstracehttp://gist.github.com/566947

答案1

Zsolt,请尝试以下三个步骤:

    1. cd /
    2. exec bash
    3./usr/bin/find /you/are/here -ls

也许是时候fsck... :-(

但在此之前,您可以尝试(备份里面的所有内容之后somedir):
cd /you/are/here && mkdir somedir.
cd /you/are/here && ln somedir newdir(以 root 身份)。

还要检查mount | egrep -e 'somedir|you|are|here'是否有任何异常。

答案2

在我写这篇文章的时候,你还没有排除 中的某些影响$LS_OPTIONS。GNU ls 有一些文件忽略选项,但ls -I foo -a仍然会忽略foo。但我的其余回答假设你在没有 的情况下也能得到相同的结果$LS_OPTIONS

事实上,这一行并不令人惊讶。这是和total 4使用的块总数。如果为空且较小,并且文件系统的块大小等于 4 个 ls 块(这很常见:GNU ls 默认为 1kB 块,而 ext[234] 通常使用 4kB 块),则预期总数为 0 + 1 * 4 = 4。......

当前文件系统发生了一些不寻常但并非闻所未闻的事情。当您请求(带有和)/you/are/here的内容时,文件系统仅响应和;然而,当您假设存在时,系统会告诉您它确实存在。这是令人惊讶但可能的行为。/you/are/hereopendir()readdir(3).../you/are/here/somedir

一个可能但可能性极小的解释是恶魔(如麦克斯韦妖,而不是守护程序) 仅在您访问目录时移动somedir到位,并在您列出目录时将其移开。因此,您观察到的异常可能是由普通程序恰好做出正确猜测引起的,并不表示操作系统存在任何问题。

事实上,操作系统可能行为方式很奇怪。常见的罪魁祸首是自动挂载系统。自动挂载系统的工作方式通常如下:

  • 目录,例如/you/are/here,被设置为挂载点的位置。专用文件系统(可能称为autofs)被挂载在那里。

  • 当您尝试访问 中的条目/you/are/here(例如 )时/you/are/here/somedir,文件系统驱动程序会尝试挂载文件系统。例如,它可能会在其配置文件中查找类似或somedir的行,并将指示的设备或 NFS 位置挂载为。somedir = /dev/foosomedir = server:/loca/tion/you/are/here/somedir

  • 当您列出目录时/you/are/here,您会看到当前已挂载的每个文件系统的子目录。

  • 当您停止使用 时/you/are/here/somedir,也许经过一段时间后,自动挂载程序会卸载somedir。因此,somedir不再出现在 的列表中/you/are/here

答案3

“which ls” 或 “alias” 显示什么?也许你的ls命令被别名或类似的东西覆盖了?运行以下命令可能会排除这种情况:

/bin/ls -a /you/are/here

背景信息:

别名优先于/bin/ls,但which ls仍显示/bin/ls。您可以通过以下方式重新创建我所指的内容:

  1. 创建一个名为的 bash 脚本ls,并保存:

    #!/bin/bash
    echo this is not ls
    
    • 为 bash 脚本创建别名:

      别名 ls='~/ls'

    • 现在,运行ls。您应该得到“this is not ls”,但which ls显示/bin/ls

排除 autofs/automount 可能也会有益。

查看已发布的更新后...

也许 LS_OPTIONS 包含 --hide 或 --ignore?

~/dirtest$ ls -a
.  ..  somewhere
~/dirtest$ ls -a --ignore='some*'
.  ..

... 是什么意思?

echo $LS_OPTIONS

...展示?或许甚至可以尝试...

unset LS_OPTIONS

...然后重新运行 ls -a。

可能是 LS_OPTIONS 正在您的 .bashrc 或其他配置文件中设置。(甚至可能是在全局级别,来自 /etc/bash*(或任何适合相关 shell 的配置文件:.login、.profile 等))

答案4

以下内容可能有帮助,也可能没有帮助,但我想看看以下两个命令的输出:

$ lsattr -av somedir
$ strace ls -a somedir

相关内容