เหตุใดไฟล์นี้จึงถูกซ่อนเมื่อคุณเรียกใช้ ls


10

แก้ไข: ฉันลืมเรื่องนี้ทั้งหมด ปรากฎว่าฉันมีฮาร์ดดิสก์ที่ไม่ดี เราต้องปรับใช้เซิร์ฟเวอร์นี้สำหรับความต้องการอื่น ๆ ดังนั้นในที่สุดฉันก็กลับมาแทนที่ดิสก์ที่ไม่ดีหนึ่งอันและเรากลับมาทำธุรกิจอีกครั้ง

สองสามสัปดาห์ตอนนี้ฉันไม่สามารถหาสาเหตุที่ฉันไม่สามารถลบไฟล์นี้โดยเฉพาะ ในฐานะที่เป็น root ฉันทำได้ แต่เชลล์สคริปต์ของฉันทำงานเป็นผู้ใช้อื่น ดังนั้นฉันไปวิ่ง ls -la และมันไม่ได้มี อย่างไรก็ตามถ้าฉันเรียกมันว่าเป็นพารามิเตอร์มันจะปรากฏขึ้น! แน่นอนว่าเจ้าของคือรูตดังนั้นฉันจึงไม่สามารถลบได้

แจ้งให้ทราบล่วงหน้า 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

ตอนนี้มันจะปรากฏขึ้นถ้าคุณเรียกมันโดยตรง

[root@server]# ls -la 6535
-rw-rw-r--  1 root root 3486 Mar 26 01:01 6535

นี่คือสิ่งที่น่าสนใจ ดังนั้นฉันจึงพบปัญหานี้เพราะในเชลล์สคริปต์ของฉันมันจะไม่สามารถลบได้เพราะ 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

2
หากคุณคิดออกโปรดโพสต์การปรับปรุง
einstiien

น่าสนใจ ได้รับรายงานอะไรกับ ls -ab อาจมีอักขระที่ไม่ใช่ฐานแปดแปลกอยู่ในชื่อไฟล์หรือไม่ ฉันคิดว่าจะมีรายการต่อไป แต่ฉันไม่แน่ใจ
egorgry

1
เมื่อเร็ว ๆ นี้คุณได้ใช้ fsck ไหม มันเป็นไปได้จากระยะไกลบางสิ่งที่เกิดขึ้นกับระบบไฟล์
Zoredache

ฉันจะต้องทดสอบอีกครั้งในวันพรุ่งนี้โดยปล่อยให้ทั้งวัน
luckytaxi

คำตอบ:


7

มันช่างน่าเป็นห่วง ฉันจะตรวจสอบว่าlsไฟล์ของคุณไม่ได้รับการแก้ไขโดยเปรียบเทียบกับไฟล์ที่รู้จักดี คุณสามารถใช้เครื่องมือแพ็คเกจของการแจกจ่ายเพื่อตรวจสอบไฟล์ในระบบแยก


+1: ls -al ควรแสดงทุกอย่าง หากไม่มีปัญหาเกิดขึ้นที่ไหนสักแห่ง
Satanicpuppy

2
มีความเป็นไปได้ค่อนข้างมากที่lsได้รับการแก้ไขเพื่อซ่อน PID ที่เฉพาะเจาะจงอาจเป็น 6535
MikeyB

ไม่ ... ไม่มีอะไร ...
luckytaxi

6

บางครั้งชื่อไฟล์จะมีอักขระแปลก ๆ เช่นลำดับการเคลื่อนไหวของเคอร์เซอร์ ลองสิ่งนี้เพื่อให้แน่ใจว่า:

ls -lq

ควรแสดงเครื่องหมายคำถามแทนอักขระควบคุม (อาจเป็นค่าเริ่มต้น แต่อาจไม่ใช่)

นี่แสดงให้เห็นบางส่วนประเภทของปัญหาที่อาจมีอยู่:

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

ฉันก็จะลอง:

type -a ls
alias ls
declare -f ls
md5sum /bin/ls    # compare to a known-good identical system

เพื่อดูว่ามีการกำหนดนามแฝงหรือฟังก์ชั่นหรือเพื่อดูว่าไบนารีอยู่ในสถานที่แปลกหรือได้รับการแก้ไข


1
+1 เข้าใจดี เป็นสิ่งสำคัญที่จะต้องทราบว่าหากlsมีการปรับเปลี่ยนmd5sumอาจมีการปรับเปลี่ยนระบบบนด้วยเช่นกัน คุณต้องมีสภาพแวดล้อมที่มีสติเพื่อตรวจสอบเพื่อให้ได้ข้อสรุปที่ชัดเจน
วอร์เนอร์

ฉันพบว่าแม้ว่า md5 จะได้รับการแก้ไขเพื่อให้ได้ผลลัพธ์ปลอมถ้าคุณทำสิ่งต่าง ๆ เช่น 'ไฟล์ md5' คุณยังสามารถรับผลลัพธ์ที่ดีได้ (หากโปรแกรม md5 ทำงานได้ทั้งหมด) โดยทำสิ่งต่าง ๆ เช่น bzip2 <file | md5 และเปรียบเทียบว่าไปที่อื่น ๆ คำสั่งเดียวกัน
chris


2

ฉันมักจะทำสิ่งนี้ถ้าฉันเชื่อว่า 'ls' ได้รับการแก้ไข ...

python -c "import os; print os.listdir('.')"

แน่นอนงูหลามที่ C Library เคอร์เนลหรือระบบไฟล์อาจจะยังได้รับการแก้ไข แต่มักจะเป็นเพียงเปลือก utils


2
หรือคุณสามารถใช้การขยายชื่อไฟล์ของเชลล์เพื่ออ่านไดเรกทอรี - echo * (และถ้าคุณต้องการทุกอย่าง echo *. *)
chris

*.*จะแสดงเฉพาะไฟล์ที่มีอักขระตามด้วยจุดตามด้วยอักขระ นี่ไม่ใช่ทุกอย่างในระบบ * nix ฉันไม่แน่ใจว่าเสียงก้องจะแสดงให้คุณเห็นทุกอย่างในคำสั่งเดียวฉันสามารถทำมันได้echo * && echo .*
einstiien

4
หากคุณมองอย่างใกล้ชิดมันคือ * (เว้นวรรค). *, ไม่ *. * เครื่องหมายวรรคตอนไม่ใช่ชุดที่แข็งแกร่งของระบบการแสดงความคิดเห็นนี้ ... และเสียงก้องมีความสุขอย่างสมบูรณ์ที่จะขยายการแสดงออกเป็นจำนวนมากคั่นด้วย "$ IFS" คุณสนใจที่จะเลี้ยงมัน บูลีน && ไม่จำเป็นจริงๆหรือแม้กระทั่งทำให้รู้สึกมากเพราะ && เป็นแบบบูลและและจะทำงานเสมอเพราะคำสั่ง echo อยู่เสมอที่ประสบความสำเร็จ
chris

@chris: ฉันไม่ดีจริงๆยากที่จะเห็นว่า
einstiien

2

คุณสามารถดูว่า ls ทำอะไรโดยใช้ strace และนั่นอาจบอกคุณได้ว่าทำไมมันถึงหลีกเลี่ยงการแสดงชื่อไฟล์นั้น

strace ls -la 653* 2>&1 | less

มองผ่านสิ่งนั้นและดูว่าเกิดอะไรขึ้น

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

ผลลัพธ์จะมีลักษณะดังนี้:

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/librt.so.1", O_RDONLY)       = 3
open("/lib/libacl.so.1", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/lib/libpthread.so.0", O_RDONLY)  = 3
open("/lib/libattr.so.1", O_RDONLY)     = 3
open("/lib/libdl.so.2", O_RDONLY)       = 3
open("/lib/libsepol.so.1", O_RDONLY)    = 3
open("/etc/selinux/config", O_RDONLY|O_LARGEFILE) = 3
open("/proc/mounts", O_RDONLY|O_LARGEFILE) = 3
open("/selinux/mls", O_RDONLY|O_LARGEFILE) = 3

และถ้าคุณเห็นสิ่งที่ชอบ

open("/var/tmp/.../H@ckl1st", O_RDONLY) = 3

ระวังคุณได้รับ 0wned ...

นี่ไม่ใช่การทดสอบข้อสรุป แต่เป็นตัวบ่งชี้ที่ดี ...

(ถ้าคุณใช้โซลาริสหรือระบบปฏิบัติการอื่น ๆ คุณอาจต้องใช้โครงมัดหรือยูทิลิตี้อื่น ๆ ที่คล้ายกันแทน strace)

(หากคุณใช้เชลล์ที่ได้มาจาก csh / tcsh คุณอาจต้องมีคำสั่งการเปลี่ยนเส้นทางที่แตกต่างกัน)


ฉันชอบสิ่งนี้. straceยูทิลิตี้จริงๆเป็นมีดทหารสวิส คุณได้รับสิทธิในระดับการโทรของระบบและข้ามกองทั้งหมดของภาวะแทรกซ้อนโดยพลการ มันเป็นหนึ่งในสิ่งแรกที่ผู้ดูแลระบบใด ๆ คุ้มค่าเล็กน้อยควรทิ้งในเครื่องที่ติดตั้งใหม่
McJeff

ใช่ - เครื่องมือที่มีค่าที่สุดสำหรับผู้ดูแลระบบคือ truss / strace และ tcpdump กับเหล่านี้คุณสามารถเสมอมองภายใต้ครอบคลุมเพื่อดู WTF ที่เกิดขึ้นเมื่อสิ่งที่เป็นหรือไม่ได้พฤติกรรมในแบบที่คุณคาดหวัง
chris

2

การอัปเดตด่วนเราต้องเปลี่ยนเซิร์ฟเวอร์ด้วยเหตุผลอื่น มันเป็นระบบไฟล์ ทั้งหมดเป็นอย่างดีในขณะนี้ !!! ขอบคุณทุกคน.


คุณหมายถึงระบบไฟล์ถูกเมาแล้วนี่เป็นเพียงอาการที่แปลกประหลาด?
chris

ใช่นั่นแหละ
luckytaxi

คุณอาจติดอยู่ในการแก้ไขเพื่อบอกว่ามีคำตอบในรายการด้านล่างเนื่องจากคำตอบนั้นฝังอยู่ใต้คำตอบ upvoted อื่น ๆ (และมีประโยชน์สำหรับการแก้ไขปัญหา)
Bart Silverstrim

0

ทฤษฎีแฮ็คน่าสนใจ แต่ฉันมีทฤษฎีทางเลือก ซีแมนทิกส์การลบไฟล์ Unix จะเก็บไฟล์ไว้รอบ ๆ จนกว่ากระบวนการทั้งหมดจะปิดการจัดการไฟล์เปิดที่ชี้ไปที่มัน อาจมีบางคนหยุดการชำระเงิน / การกระทำของ SVN หรือกลุ่มเธรดเซิร์ฟเวอร์หยุดทำงานชั่วคราว หากการรีสตาร์ทกระบวนการ SVN (หรือ Apache) แก้ปัญหาของคุณนี่คือที่ที่ฉันจะกล่าวโทษ

บางทีคุณสามารถระบุกระบวนการที่ยังคงใช้ไฟล์นี้ด้วยlsof | grep 6535?


ใช่แล้วไม่ได้แสดงอะไรเลย สิ่งที่น่าสนใจคือ 6535 ก็คือ "หายไป" ในแหล่งข้อมูล สคริปต์ของฉันทำสำเนาต้นฉบับของ repo ไปยังไดเรกทอรีอื่น นั่นคือเมื่อฉันพบปัญหาที่ไม่สามารถลบไฟล์นี้ด้วยเหตุผลบางอย่าง
luckytaxi

ไฟล์ที่ถูกลบ แต่เปิดอยู่จะไม่ป้องกันไม่ให้คุณลบไดเรกทอรีที่มีอยู่เพราะเมื่อลบรายการไดเรกทอรีแล้วรายการไดเรกทอรีจะไม่มีอยู่ดังนั้นไดเรกทอรีจะว่างเปล่า คุณจะไม่ได้รับพื้นที่คืนจากไฟล์จนกว่ากระบวนการที่เปิดจะถูกฆ่า แต่ไดเรกทอรีที่มีไฟล์นั้นจะสามารถลบได้
chris

ทฤษฎีทางเลือกของคุณน่าสนใจ การลบหากสำเร็จจะลบฮาร์ดลิงก์ทันที ไอโหนดจะยังคงมีข้อมูลและการจัดการไฟล์บางอย่างอาจมีแคชในหน่วยความจำ แต่ฉันไม่เชื่อว่าสถานการณ์นี้สามารถอธิบายพฤติกรรมที่อธิบายไว้ได้ หรือสิ่งที่คริสพูดเฮ้
วอร์เนอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.