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


2

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

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

这是shell会话(as 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

请注意第一个之后的总计4ls -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。

UPDATE

(对不起,但昨天我不得不离开)

我做了检查echo *,其输出是:. ..。这是LS_OPTIONS-a -N --color=tty -T 0

我检查了Gilles提到的automount事情,但是当我改变somewhere并发出了mount|grep somewhere没有输出的时候。

这是建议的输出lsattrstrace输出:http//gist.github.com/566947


其他人无法关注这个问题?你可以修改,因为我无法理解你在问什么。
克里斯2010年

我认为somedir确实存在?打字时有线索ls -a /you/are/here/somedir吗?
Arjan 2010年

1
@Chris,ls -a没有列出somedir(到root),但仍然cd somedir可以正常工作。
Arjan 2010年

2
ls is aliased to /bin/ls $LS_OPTIONS。那么,那echo $LS_OPTIONS给你什么呢?(虽然我怀疑这是相关的,而你也明确地使用/bin/ls相同的结果,和有趣的“总共4”...)
Arjan 2010年

1
做任何echo *ls -ld somedirls -lbls -l|cat -v显示任何东西有用吗?
丹尼斯威廉姆森2010年

Answers:


3

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(作为根)。

还要检查是否mount | egrep -e 'somedir|you|are|here'有任何奇怪之处。


这样做,除了reboot / fsck循环(因为我不被允许这样做)。在find还没有找到somewhere。我可以创建新somedir目录,并可以链接到它。我无法创建一个somewhere目录,因为它抱怨,该文件已经存在。我也可以链接到somewhere,之后ls -l我可以看到一个列表,其中有一个链接到同一个父目录中的目录,并且无法看到目标。
Zsolt Botykai 2010年

@Zsolt:对不起,我不明白; 没有了mkdir somedir及格或不及格?here除了备份之外,我不会在这个文件系统(或目录)上做更多的事情。它已经坏了,或者它的缓存(在内核中)已经损坏了。如果幸运的话,fsck可以somedir再次重新链接目录。如果没有,你可能会失去它。对我来说听起来像是停机的时候了。mv如果您设法链接到它,请尝试。(mv somedir olddir; mv newdir somedir)如果有效,也许你敢unlink olddir
MattBianco 2010年

1
Fsck发现它:很可能是一些文件系统错误。somedir目录已移至lost+found。现在我们正在测试磁盘以获得更多错误。
Zsolt Botykai 2010年

5

在我写这篇文章的时候,你还没有排除其中的影响$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/here(带opendir()readdir(3))的内容时,文件系统只响应...; 然而,当你认为/you/are/here/somedir存在时,你被告知它确实存在。这是令人惊讶但可能的行为。

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

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

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

  • 当您尝试访问某个条目时/you/are/here,例如/you/are/here/somedir,文件系统驱动程序尝试装入somedir文件系统。例如,它可能会在其配置文件中查找somedir = /dev/foo或者somedir = server:/loca/tion在其中查找指定的设备或NFS位置/you/are/here/somedir

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

  • 当您停止使用时/you/are/here/somedir,可能是在延迟之后,自动挂载程序卸载somedir。因此somedir不再出现在列表中/you/are/here


1
感谢麦克斯韦的恶魔链接,有趣的阅读,以及automount解释是可能的。然而,我假设,如果我改变somewhere,然后发出一个mount|grep somewhere并且它在那时被挂载,它应该被列出,但事实并非如此。
Zsolt Botykai 2010年

3

“哪个”或“别名”显示什么?也许你的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。你应该得到“这不是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。

可能是在.bashrc或其他配置文件中设置了LS_OPTIONS。(甚至可能在全局级别,来自/ etc / bash *(或者有问题的shell的适当配置文件:.login,.profile等)


1
我猜我已经检查:ls/bin/ls,和pwd/bin/pwd,无论是从原包装是指?
Arjan 2010年

1
仍然,明确运行的@Zsolt /bin/ls -a /you/are/here可能会排除这一点,并且很容易测试?
Arjan 2010年

1
不必要。别名优先于/ bin / ls ...但是'which ls'仍然显示/ bin / ls。我还是排除了别名等等。您可以通过以下方式重新创建我所指的内容:创建一个名为“ls”的bash脚本。添加典型的#!/ bin / bash和第二行,例如:echo this is not ls为bash脚本创建别名...类似于:alias ls ='〜/ ls'现在,运行ls。你应该得到“这不是ls”,但是“which ls”显示/ bin / ls。排除autofs / automount可能也是有益的...
Matt 2010年

是的,我认为/ bin / ls -a / you / are / here将是一个很好的测试。
马特2010年

这样做了,问题更新了。
Zsolt Botykai 2010年

2

你能尝试一下可能会走在目录树上的其他工具吗?

例如du -h,获取目录的大小?如果从驱动器根目录启动,或者与驱动器根目录/you/are/here相比,您会观察到什么行为/you/are/here/somedir

另外 - 你可以创建一个文件/you/are/here/somedir吗?如果是这样,一旦你离开目录,它会持续存在吗?创建文件会导致目录对ls命令可见吗?



0

也许某些进程正在对目录做一些事情。您是否尝试过lsof dirnamelsof /path/to/parent/*lsof dirname/*

怎么样stat dirname

怎么样readlink -ev dirname

我看到你做了type ls- type -a ls显示了什么?

是否$PATH有什么异常?它包括.(点)吗?

你用的是什么外壳?您是否尝试过ls dirname在另一个shell中创建原始文件(特别是在全新的会话/登录之后?

如果您正在使用带有制表符完成的shell,它是否会完成目录名称?

您是否可以访问文件管理器GUI或文本模式(如mcMidnight Commander)或emacs dired?他们可以导航进出这个目录吗?

我会严重怀疑某些东西已被破坏或被黑客入侵。


0

LS帮助提供了这一点,这可能是有用的。

-a, --all                  do not ignore entries starting with .
-A, --almost-all           do not list implied . and ..
    --author               with -l, print the author of each file

-1

在这一点上,在我看来,最可能的事情是你的服务器被黑了,并且加载了rootkit,使目录不会出现在列表中。根工具包可以使用内核模块来执行此操作,该模块可以挂接或重定向readdir和getdents系统调用。如果模块保持驻留,那么它可能也会显示在/ proc / modules或lsmod中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.