কেন “ls -a” মূল ব্যবহারকারী থেকে কিছু বিদ্যমান ডিরেক্টরি আড়াল করে?


2

আজ আমি আমাদের পরীক্ষার সার্ভারগুলির মধ্যে একটি সত্যিই আকর্ষণীয় কিছু পেয়েছি (কমপক্ষে আমার কাছে):

আমি আপেক্ষিক পথটি ব্যবহার করে আমার প্রকৃত কার্যনির্বাহী ডিরেক্টরি থেকে একটি বিদ্যমান ডিরেক্টরিতে পরিবর্তন করতে পারি, তবে ব্যবহারের সময় সেই একই ডিরেক্টরিটি তালিকাভুক্ত হয় না ls -a

শেল সেশনটি এখানে 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একটি মাউন্ট করা ইএমসি ডিস্ক (ext3)। এবং somedirবিদ্যমান রয়েছে কারণ আমি এর লিখিত সামগ্রীগুলি তালিকাবদ্ধ করতে পারি (বেশ কয়েকটি সাবডির, ফাইল রয়েছে)। এর নাম বিন্দু দিয়ে শুরু হয় না।

কমান্ড এবং 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$

এবং ইএমসি হ'ল: http://www.emc.com/products/family/disk-library-family.htm , তবে তারা কেবল এই ক্ষেত্রে হার্ড ডিস্ক সহ একটি ডিস্ক সরবরাহকারী, ext3 হিসাবে ফর্ম্যাট করা।

হালনাগাদ

(দুঃখিত, তবে গতকাল আমাকে চলে যেতে হয়েছিল)

আমি চেক করেনি echo *, এবং তার আউটপুট হল: . ..। এখানে LS_OPTIONS: -a -N --color=tty -T 0

আমি গিলস দ্বারা উল্লিখিত স্বতঃপরিবর্তনীয় জিনিসটি যাচাই করেছিলাম, কিন্তু আমি পরিবর্তিত হয়েছি somewhereএবং একটি জারি mount|grep somewhereকরার পরে কোনও আউটপুট ছিল না।

প্রস্তাবিত হিসাবে এখানে ফলাফল lsattrএবং straceআউটপুট: http://gist.github.com/566947 47


অন্য কেউ এই প্রশ্ন অনুসরণ করতে পারবেন না? আপনি কী জিজ্ঞাসা করছেন তা আমি বুঝতে না পারলে আপনি কি দয়া করে সংশোধন করতে পারেন?
ক্রিস

আমি অনুমান করি যে somedirআসলেই আছে? টাইপ করার সময় কোনও ক্লু ls -a /you/are/here/somedir?
আরজান

1
@ ক্রিস, তালিকাবদ্ধ ls -aকরে না somedir( rootতবে), তবে এখনও cd somedirঠিক কাজ করে।
আরজান

2
ls is aliased to /bin/ls $LS_OPTIONS। তো, তাহলে কি দেয় echo $LS_OPTIONS? (যদিও আমি সন্দেহ করি যে এটি প্রাসঙ্গিক যখন আপনি /bin/lsএকই ফলাফলের সাথে স্পষ্টভাবে ব্যবহার করেছিলেন, এবং আগ্রহী "মোট 4" ...)
আরজান

1
কোন কি echo *, ls -ld somedir, ls -lbবা ls -l|cat -vকিছু সহায়ক দেখাবেন?
ডেনিস উইলিয়ামসন

উত্তর:


3

জসোল্ট, দয়া করে এই তিনটি পদক্ষেপ ব্যবহার করে দেখুন:

    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'কোনও বিজোড়তা পরীক্ষা করে দেখুন ।


রিবুট / fsck চক্র ব্যতীত (তা করার অনুমতি দেওয়া হচ্ছে না) হিসাবে করে। findএছাড়াও পাওয়া যায়নি somewhere। আমি নতুন somedirডিরেক্টরিটি তৈরি করতে এবং এর সাথে লিঙ্ক করতে পারি। আমি একটি somewhereদির তৈরি করতে পারি না , যেমন এটি অভিযোগ করে, ফাইলটি ইতিমধ্যে বিদ্যমান। আমি somewhereপাশাপাশি লিঙ্ক করতে পারি , এবং এর পরে ls -lআমি একই তালিকাতে দেখতে পাই যেখানে একই পিতামাতার মধ্যে ডিরেক্টরিতে কোনও লিঙ্ক রয়েছে এবং লক্ষ্যটি দেখতে পাচ্ছি না।
Zsolt Botykai

@ জোল্ট: মাফ করবেন, আমি বুঝতে পারি না; হয়নি mkdir somedirপাস বা ব্যর্থ? আমি এই ফাইল সিস্টেমে (বা hereডিরেক্টরিতে) ব্যাকআপ ব্যতীত আর কিছুই করব না । এটি ভেঙে গেছে, বা এর ক্যাশ (কর্নেলের মধ্যে) দূষিত। আপনি ভাগ্যবান, fsck somedirডিরেক্টরি আবার সংযোগ করতে পারেন । যদি না হয়, আপনি এটি হারাতে পারে। আমার কাছে মনে হচ্ছে এটি কিছু ডাউনটাইমের সময় time আপনি mvযদি এটির সাথে লিঙ্ক করতে সক্ষম হন তবে চেষ্টা করুন । ( mv somedir olddir; mv newdir somedir) যদি এটি কাজ করে তবে আপনার সাহস হবে unlink olddir?
ম্যাটবিয়ানকো

1
Fsck এটি খুঁজে পেয়েছে: সম্ভবত এটি কোনও ফাইল সিস্টেমের ত্রুটি ছিল। সোমডির ডিরেক্টরিতে সরানো হয়েছিল lost+found। এখন আমরা আরও ত্রুটির জন্য ডিস্কটি পরীক্ষা করছি।
জসোল্ট বটিকাই

5

আমি যখন এটি লিখছি, আপনি কিছুতে এর প্রভাবগুলি এড়িয়ে গেছেন $LS_OPTIONS। জিএনইউতে কিছু ফাইল উপেক্ষা করার বিকল্প রয়েছে, এবং ls -I foo -aএখনও তা উপেক্ষা করছে foo। তবে আমার উত্তরটির বাকি অংশগুলি ধরে নিলে আপনিও একই ফলাফল পান $LS_OPTIONS

total 4লাইন না, আসলে, বিস্ময়কর। এই দ্বারা ব্যবহৃত ব্লক মোট সংখ্যা .এবং ..। যদি .খালি থাকে এবং ..ছোট হয় এবং এমন একটি ফাইল সিস্টেমে যার ব্লকের আকার 4 এলএস ব্লকের সমান (যা সাধারণ: জিএনইউ এলএস ডিফল্ট 1 কেবি ব্লকের, এবং প্রায় [234] প্রায়শই 4 কেবি ব্লকের ব্যবহার করে), তবে প্রত্যাশিত মোট 0 + 1 * 4 = 4।

চালু রয়েছে এমন সিস্টেম সিস্টেমের সাথে অসাধারণ কিছু আছে, তবে শোনা যায় না /you/are/here। আপনি যখন /you/are/here( opendir()এবং এর সাথে readdir(3)) এর বিষয়বস্তুগুলির জন্য জিজ্ঞাসা করবেন তখন ফাইল সিস্টেম কেবল .এবং এর সাথে সাড়া দেয় ..; তবুও যখন আপনি ধরে নেন যে এটি /you/are/here/somedirবিদ্যমান, আপনাকে বলা হয় যে এটি আছে। এটি আশ্চর্যজনক তবে সম্ভাব্য আচরণ।

একটি সম্ভাব্য কিন্তু অত্যন্ত অসম্ভব ব্যাখ্যা হ'ল একটি রাক্ষস (যেমন ম্যাক্সওয়েলের রাক্ষুসে , ডেমন প্রোগ্রাম হিসাবে নয় ) যিনি somedirআপনার অ্যাক্সেস করার সময় স্থানটিতে চলে যান এবং ডিরেক্টরিটি তালিকাভুক্ত করার সময় এটিকে সরিয়ে নিয়ে যান। সুতরাং আপনি যে অদ্ভুততা লক্ষ্য করেন তা কোনও সাধারণ প্রোগ্রামের কারণে ঘটতে পারে যা সঠিক অনুমান করা যায়, এটি অপারেটিং সিস্টেমের সাথে কোনও ভুলকে নির্দেশ করে না।

বস্তুত, অপারেটিং সিস্টেম সম্ভবত হয় একটি অদ্ভুত ভাবে আচরণ। একটি সাধারণ অপরাধী একটি অটোমোটিং ব্যবস্থা ing অটোমোটিং সিস্টেমটি যেভাবে কাজ করে তা হ'ল সাধারণত:

  • একটি ডিরেক্টরি, বলুন /you/are/here, মাউন্ট পয়েন্টগুলির জন্য অবস্থান হিসাবে সেট আপ করা হয়। একটি বিশেষ উদ্দেশ্যে ফাইল সিস্টেম (সম্ভবত বলা হয় autofs) সেখানে মাউন্ট করা হয়।

  • আপনি যখন কোনও এন্ট্রিতে প্রবেশ করার চেষ্টা করবেন /you/are/here, বলুন /you/are/here/somedir, ফাইল-সিস্টেম ড্রাইভার somedirফাইল সিস্টেমটি মাউন্ট করার চেষ্টা করে । উদাহরণস্বরূপ, এটি এর কনফিগারেশন ফাইলের মতো somedir = /dev/fooবা কোনও লাইনের সন্ধান করতে পারে somedir = server:/loca/tionএবং নির্দেশিত ডিভাইস বা এনএফএসের অবস্থান হিসাবে মাউন্ট করতে পারে /you/are/here/somedir

  • আপনি যখন ডিরেক্টরিটি তালিকাভুক্ত করেন /you/are/here, আপনি বর্তমানে প্রতিটি মাউন্ট করা ফাইল সিস্টেমের জন্য একটি উপ-ডিরেক্টরি দেখতে পাবেন।

  • আপনি যখন ব্যবহার বন্ধ করেন /you/are/here/somedir, সম্ভবত কোনও বিলম্বের পরে, অটোমোন্টারটি আনমাউন্ট করে somedir। সুতরাং somedirআর তালিকাতে প্রদর্শিত হবে না /you/are/here


1
ম্যাক্সওয়েলের রাক্ষস লিঙ্কটির জন্য ধন্যবাদ, আকর্ষণীয় পড়া, এবং স্বতঃসম্পূর্ণ ব্যাখ্যা সম্ভাবনা। তবুও, আমি ধরে নিই, যদি আমি পরিবর্তিত হয়ে যাই somewhere, তবে একটি জারি করুন mount|grep somewhereএবং এটি সেই সময়ে মাউন্ট করা হয়েছে, এটি তালিকাভুক্ত করা উচিত, যা এটি নয়।
Zsolt Botykai

3

"কোন এলএস" বা "ওরফে" কী দেখায়? সম্ভবত আপনার lsকমান্ডটি কোনও উপাধি বা এর মতো দিয়ে ওভাররাইড হচ্ছে? নিম্নলিখিত চালানো এটিকে বাতিল করতে পারে:

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

কিছু পটভূমি:

উপনাম প্রাধান্য লাগে বেশী /bin/ls, এখনো which lsএখনো দেখায় /bin/ls। আমি যা উল্লেখ করছি তা আপনি পুনরায় তৈরি করতে পারেন:

  1. বলে lsরাখা একটি বাশ স্ক্রিপ্ট তৈরি করুন :

    #!/bin/bash
    echo this is not ls
    
    • ব্যাশ স্ক্রিপ্টে একটি উপকরণ তৈরি করুন:

      ওরফে ls = '~ / ls'

    • এখন, চালান ls। আপনি "এটি ls নয়" পাওয়া উচিত, তবুও which lsশো /bin/ls

অটোফ / অটোম্যান্ট বাতিল করাও উপকারী হতে পারে।

পোস্ট আপডেটগুলি পর্যালোচনা করার পরে ...

সম্ভবত এলএস_অপশনগুলিতে একটি - লুকানো বা --ignore রয়েছে?

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

কি করে...

echo $LS_OPTIONS

... দেখাবেন? এমনকি চেষ্টা করুন ...

unset LS_OPTIONS

... তারপরে ls -a আবার চালাও।

এটি হতে পারে যে আপনার .bashrc বা অন্য কনফিগারেশনে LS_OPTIONS সেট করা আছে। (এমনকি বিশ্বব্যাপী স্তরেও, ইত্যাদি থেকে / ইত্যাদি / বাশ * (বা শেলটির জন্য যেকোন উপযুক্ত কনফিগার ফাইল যাকে প্রশ্ন: লগিন,। প্রোফাইল, ইত্যাদি)


1
আমি চাই আমি চেক করেছি: lsথেকে /bin/ls, এবং pwdহয় /bin/pwd, উভয় তাদের মূল প্যাকেজ থেকে যে বোঝায়?
আরজান

1
তবুও, @ জোলসোল্ট, স্পষ্টভাবে দৌড়াদৌড়ি এড়িয়ে /bin/ls -a /you/are/hereযেতে পারে এবং সহজেই পরীক্ষা করা হয়?
আরজান

1
অগত্যা। একটি উপাধি / বিন / এলএসের চেয়ে বেশি অগ্রাধিকার নিয়েছে ... তবুও 'যা ls' এখনও দেখায় / বিন / এলএস করে। আমি বাইরের নাম এবং এই জাতীয় কিছু বাতিল করব। আমি এর দ্বারা যা উল্লেখ করছি তা আপনি পুনরায় তৈরি করতে পারেন: "এলএস" নামে একটি বাশ স্ক্রিপ্ট তৈরি করুন। টিপিক্যাল #! / বিন / বাশ এবং একটি দ্বিতীয় লাইন যুক্ত করুন এর মতো কিছু যুক্ত করুন: প্রতিধ্বনি এটি ls নয় বাশ স্ক্রিপ্টে একটি উপনাম তৈরি করুন ... এর মতো কিছু: ওরফে ls = '~ / ls' এখন, চালান ls। আপনার "এটি এলএস নয়" হওয়া উচিত, তবুও "কোন এলএস" শো / বিন / এলএস দেখায়। অটোফ / অটোমাউন্ট বাতিল করার পক্ষেও এটি উপকারী হতে পারে ...
ম্যাট

হ্যাঁ, আমি মনে করি / বিন / এলএস -এ / আপনি / আছেন / এখানে দুর্দান্ত পরীক্ষা হবে।
ম্যাট

তাই, প্রশ্ন আপডেট হয়েছে।
জসোল্ট বটিকাই

2

আপনি কি অন্যান্য সরঞ্জাম ব্যবহার করতে পারেন যা ডিরেক্টরি ট্রিতে হাঁটতে পারে?

উদাহরণস্বরূপ du -hডিরেক্টরি আকার পেতে? আপনি যদি ড্রাইভ রুট থেকে, বা /you/are/hereতুলনামূলকভাবে থেকে চালু করেন তবে আপনি কোন আচরণটি লক্ষ্য করেন /you/are/here/somedir?

এছাড়াও - আপনি একটি ফাইল তৈরি করতে পারেন /you/are/here/somedir? যদি তাই হয়, আপনি একবার ডিরেক্টরি থেকে সরে গেলে এটি কি স্থির থাকে? ফাইল তৈরি করার ফলে ডিরেক্টরিটি lsকমান্ডের সাথে দৃশ্যমান হয় ?


0

নিম্নলিখিতগুলি সাহায্য করতে পারে বা নাও পারে তবে আমি নিম্নলিখিত দুটি কমান্ডের ফলাফল দেখতে চাই:

$ lsattr -av somedir
$ strace ls -a somedir

এই আউটপুটটি এখানে: gist.github.com/566947
Zsolt Botykai

0

সম্ভবত কিছু প্রক্রিয়া ডিরেক্টরি সহ কিছু করছে। আপনি চেষ্টা করেছেন lsof dirname, lsof /path/to/parent/*এবং lsof dirname/*?

কি হবে stat dirname?

কি হবে readlink -ev dirname?

আমি আপনাকে দেখেছি type ls- কি type -a lsদেখায়?

না $PATHকিছু অস্বাভাবিক অন্তর্ভুক্ত? এটিতে .(বিন্দু) অন্তর্ভুক্ত রয়েছে ?

আপনি কোন শেল ব্যবহার করছেন? আপনি কি ls dirnameঅন্য শেলটিতে মূলটি চেষ্টা করার চেষ্টা করেছেন (বিশেষত সম্পূর্ণ নতুন সেশন / লগইনের পরে?

আপনি যদি ট্যাব সমাপ্তি সহ একটি শেল ব্যবহার করছেন তবে এটি ডিরেক্টরি নামের জন্য একটি সমাপ্তি করবে?

আপনি কি জিইউআই বা mc(মিডনাইট কমান্ডার) এর মতো কোনও পাঠ্য-মোডে কোনও ফাইল ম্যানেজারের অ্যাক্সেস পেয়েছেন emacs dired? তারা এই ডিরেক্টরিতে এবং বাইরে নেভিগেট করতে পারেন?

আমি গুরুতরভাবে সন্দেহ করব যে কোনও কিছু দূষিত বা হ্যাক হয়েছে।


0

এলএস সহায়তা এটি সরবরাহ করে, যা কিছুটা কার্যকর হতে পারে।

-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

এই মুহুর্তে, আমার কাছে এটি সম্ভবত সবচেয়ে সম্ভবত মনে হচ্ছে আপনার সার্ভারটি হ্যাক হয়ে গিয়েছিল এবং একটি রুটকিট লোড করা হয়েছিল যা ডিরেক্টরিতে তালিকাগুলি প্রদর্শিত হতে বাধা দেয়। রুট কিটটি কার্নেল মডিউল দিয়ে এটি করবে যা রিডডির এবং গেটডেন্টস সিস্টেম কলগুলিকে হুক করে বা পুনঃনির্দেশ করে। যদি মডিউলটি বাসিন্দা থাকে তবে সম্ভবত এটি / প্রো / মডিউলগুলিতে বা এলএসএম দ্বারা প্রদর্শিত হওয়া থেকে নিজেকে নিবিষ্ট করে তুলবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.