为什么在运行 ls 时隐藏此文件?

sdo*_*257 10 linux shell command-line-interface

编辑:我完全忘记了这个线程。原来我的硬盘坏了。我们不得不重新部署这台服务器以满足其他需求,所以我终于有时间更换一个坏磁盘,我们重新开始营业。

几个星期以来,我不明白为什么我无法删除这个特定的文件。作为 root 我可以,但我的 shell 脚本以不同的用户身份运行。所以我去运行 ls -la 并且它不在那里。但是,如果我将其作为参数调用,它就会显示出来!果然,所有者是root,因此我无法删除。

请注意,缺少 6535 ...

[root@server]# ls -la 653*
-rw-rw-r--  1 svn svn  24002 Mar 26 01:00 653
-rw-rw-r--  1 svn svn   7114 Mar 26 01:01 6530
-rw-rw-r--  1 svn svn   8653 Mar 26 01:01 6531
-rw-rw-r--  1 svn svn   6836 Mar 26 01:01 6532
-rw-rw-r--  1 svn svn   3308 Mar 26 01:01 6533
-rw-rw-r--  1 svn svn   3918 Mar 26 01:01 6534
-rw-rw-r--  1 svn svn   3237 Mar 26 01:01 6536
-rw-rw-r--  1 svn svn   3195 Mar 26 01:01 6537
-rw-rw-r--  1 svn svn  27725 Mar 26 01:01 6538
-rw-rw-r--  1 svn svn 263473 Mar 26 01:01 6539
Run Code Online (Sandbox Code Playgroud)

现在,如果您直接调用它,它就会显示出来。

[root@server]# ls -la 6535
-rw-rw-r--  1 root root 3486 Mar 26 01:01 6535
Run Code Online (Sandbox Code Playgroud)

这里有一些有趣的事情。所以我发现了这个问题,因为在我的 shell 脚本中,它无法删除,因为 6535 归 root 所有。该文件实际上是在我运行“rm -rf”后出现的。我之前尝试过,它无法删除目录,因为它告诉我目录不是空的。我进去一看,果然,文件“6535”终于出现了。不知道为什么要这样做。

strace 说如下

#strace ls -la 653* 2>&1 | grep ^open

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/tls/librt.so.1", O_RDONLY) = 3
open("/lib64/libacl.so.1", O_RDONLY)    = 3
open("/lib64/libselinux.so.1", O_RDONLY) = 3
open("/lib64/tls/libc.so.6", O_RDONLY)  = 3
open("/lib64/tls/libpthread.so.0", O_RDONLY) = 3
open("/lib64/libattr.so.1", O_RDONLY)   = 3
open("/etc/selinux/config", O_RDONLY)   = 3
open("/proc/mounts", O_RDONLY)          = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/proc/filesystems", O_RDONLY)     = 3
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
open("/usr/share/locale/en_US.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/nsswitch.conf", O_RDONLY)    = 3
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/libnss_files.so.2", O_RDONLY) = 3
open("/etc/passwd", O_RDONLY)           = 3
open("/etc/group", O_RDONLY)            = 3
open("/etc/mtab", O_RDONLY)             = 3
open("/proc/meminfo", O_RDONLY)         = 3
open("/etc/localtime", O_RDONLY)        = 3
Run Code Online (Sandbox Code Playgroud)

War*_*ner 7

这就有点担心了。我会ls通过与已知的良好文件进行比较来验证您的文件是否未被修改。您可以使用发行版的打包工具来验证隔离系统上的文件。

  • `ls` 很可能已被修改以隐藏特定的 PID,可能是 6535。 (2认同)

Den*_*son 6

有时文件名会包含奇怪的字符,例如光标移动序列。试试这个以确保:

ls -lq
Run Code Online (Sandbox Code Playgroud)

它应该显示问号而不是控制字符(这可能是默认值,但也可能不是)。

这部分说明了可能存在的问题类型:

touch A C
touch B$(tput cuu1)$'\r'
ls -l
ls -lq
ls -l --show-control-chars    # for systems that have that option and default to -q
Run Code Online (Sandbox Code Playgroud)

我也会尝试:

type -a ls
alias ls
declare -f ls
md5sum /bin/ls    # compare to a known-good identical system
Run Code Online (Sandbox Code Playgroud)

查看是否定义了别名或函数,或者查看二进制文件是否位于奇怪的位置或已被修改。


sdo*_*257 2

更新很快,因为其他原因我们不得不更换服务器。这是文件系统。现在一切都好啦!!!谢谢大家。