এমন কোনও ফাইল আছে যা সর্বদা উপস্থিত থাকে এবং একজন 'সাধারণ' ব্যবহারকারী এটি লাস্ট করতে পারে না?


14

ইউনিট পরীক্ষার জন্য আমার এটি দরকার। এখানে একটি ফাংশন রয়েছে যা ফাইল প্যাথটিতে তার প্যারামিটার হিসাবে পাস করেছে st lstatব্যর্থ হয় এমন কোডের পথে আমাকে ট্রিগার করতে হবে (কারণ কোডের কভারেজটি 90% পর্যন্ত পৌঁছাতে হবে)

পরীক্ষাটি কেবলমাত্র একক ব্যবহারকারীর অধীনে চলতে পারে, তাই আমি ভাবছিলাম যে উবুন্টুতে এমন কোনও ফাইল রয়েছে যা সর্বদা উপস্থিত থাকে, তবে সাধারণ ব্যবহারকারীদের এটিতে বা এর ফোল্ডারে কোনও পঠন অ্যাক্সেস নেই। (সুতরাং lstatরুট হিসাবে কার্যকর না হলে এটিতে ব্যর্থ হবে))

একটি অস্তিত্বহীন ফাইল সমাধান নয়, কারণ এর জন্য একটি পৃথক কোড পাথ রয়েছে, যা আমি ইতিমধ্যে ট্রিগার করছি।

সম্পাদনা: কেবলমাত্র ফাইলে পঠিত অ্যাক্সেসের অভাবই যথেষ্ট নয়। এর সাথে lstatএখনও কার্যকর করা যেতে পারে। / রুটে একটি ফোল্ডার এবং এতে একটি ফাইল তৈরি করে আমি এটির (আমার স্থানীয় মেশিনে, যেখানে আমার কাছে রুট অ্যাক্সেস রয়েছে) ট্রিগার করতে সক্ষম হয়েছিল। এবং ফোল্ডারে 700 অনুমতি নির্ধারণ করা হচ্ছে। সুতরাং আমি এমন কোনও ফাইলে অনুসন্ধান করছি যা একটি ফোল্ডারে রয়েছে যা কেবল রুট দ্বারা অ্যাক্সেসযোগ্য।


6
আইএমএইচও/etc/shadow
রোমিও নিনভ

3
আপনি কোনও ফাইলের অস্তিত্ব ধরে নিতে পারবেন না, কারণ আপনার প্রোগ্রামটি ক্রোট বা পৃথক নেমস্পেসে চলতে পারে। যদি ধরে নেওয়া হয় যে / প্রোক মাউন্ট করা হয়েছে ঠিক আছে এবং থিমটি বিশেষ কিছু নয় তবে তা করা /proc/1/fd/0উচিত।
ম্যাসভি

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

2
যখন আপনি কেবল একটি নিক্ষিপ্ত ফাইল তৈরি করতে এবং এতে নিজের পাঠ্য অ্যাক্সেস সরিয়ে ফেলতে পারেন তবে কেন আপনি নিজের পরীক্ষার কোডটি ওএসের নির্দিষ্ট গন্ধের সাথে বেঁধে রাখছেন?
কিলিয়ান ফট

4
আমি যুক্তি দিয়ে বলছি যে এটি একটি ইউনিট পরীক্ষা না হলে এটি একবার উপহাসের পরিবর্তে একটি বাস্তবের উপর নির্ভর করে শুরু করে, ফাইল সিস্টেম।
টবি স্পিড

উত্তর:


21

আধুনিক লিনাক্স সিস্টেমে আপনার /proc/1/fdinfo/0আইডি 1 প্রক্রিয়াটির (ফাইল ডেস্ক্রিপ্টর 1 (স্টাডআউট) এর তথ্য ব্যবহার করতে সক্ষম হবেন ( initমূল পিড নেমস্পেসে যা চলতে হবে root))।

আপনি (একটি সাধারণ ব্যবহারকারী হিসাবে) এর সাথে একটি তালিকা পেতে পারেন:

sudo find /etc /dev /sys /proc -type f -print0 |
  perl -l -0ne 'print unless lstat'

( -type fআপনি যদি নিয়মিত ফাইলগুলিতে সীমাবদ্ধ রাখতে না চান তবে সরান )।

/var/cache/ldconfig/aux-cacheঅন্য সম্ভাব্য প্রার্থী হ'ল যদি আপনাকে কেবল উবুন্টু সিস্টেমগুলি বিবেচনা করা প্রয়োজন। এটি বেশিরভাগ জিএনইউ সিস্টেমে কাজ করা উচিত যেমন /var/cache/ldconfigপাঠানো + লিখুন + অনুসন্ধান করতে ldconfigপারা যায় কেবল GNU libc দিয়ে আসে এমন কমান্ড দ্বারা রুট করার জন্য ।


1
ধন্যবাদ! যদি /proc/1/fdinfo/0উবুন্টু 16.04 এবং 18.04 এ কাজ করে তবে এটি যথেষ্ট পরিমাণে বেশি।
বিড়ালছানা

1
ব্যবহার করা /proc/1/fdinfo/0অগত্যা কোনও পাত্রে (যেমন, একটি ডকারের ধারক) কাজ করে না এবং প্রায়শই সিআইতে এই জাতীয় পাত্রে ইউনিট পরীক্ষা চালানো হয়।
ফিলিপ উইন্ডার

@ ফিলিপওয়েেন্ডার, আমি ইতিমধ্যে রুট পিড নেমস্পেসের কথা উল্লেখ করেছি । ওপি কনটেইনার সম্পর্কে জিজ্ঞাসা করছে না তবে একটি উবুন্টু সিস্টেমের ফাইল সিস্টেম লেআউটে থাকার গ্যারান্টিযুক্ত ফাইলগুলি সম্পর্কে জিজ্ঞাসা করছে। পাত্রে কোনও ফাইল এবং ডিরেক্টরি বিন্যাস থাকতে পারে, সেই প্রশ্নটি সেখানে উত্তরযোগ্য হতে পারে না।
স্টাফেন চেজেলাস

12

Lstat (2) ম্যান পেজটি দেখে আপনি কিছু ক্ষেত্রে অনুপ্রেরণা পেতে পারেন যা এটি ENOENT ব্যতীত অন্য কোনও ত্রুটির সাথে ব্যর্থ হতে পারে (ফাইলের অস্তিত্ব নেই))

সর্বাধিক সুস্পষ্ট হ'ল:

EACCES অনুসন্ধান অনুমতি পথ উপসর্গ মধ্যে ডিরেক্টরি একটির জন্য অস্বীকার করা হয় পথ

সুতরাং আপনার একটি ডিরেক্টরি দরকার যা আপনি সন্ধান করতে পারবেন না।

হ্যাঁ, আপনি ইতিমধ্যে আপনার সিস্টেমে এমন একটিটির সন্ধান করতে পারেন (সম্ভবত /var/lib/privateএটি উপস্থিত থাকলে?) তবে আপনি নিজেও একটি তৈরি করতে পারেন এর সমতুল্য:

$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile

Lstat (2) অপারেশন এখানে EACCES দিয়ে ব্যর্থ হবে। (ডিরেক্টরি থেকে সমস্ত অনুমতি সরিয়ে ফেলা এটি নিশ্চিত করে। সম্ভবত আপনার খুব বেশি প্রয়োজনও নেই এবং chmod -xসম্পাদনকারী অনুমতিগুলি অপসারণই যথেষ্ট হবে, কারণ এর অধীনে ফাইলগুলিতে অ্যাক্সেসের জন্য কোনও ডিরেক্টরিতে এক্সিকিউট করার অনুমতি প্রয়োজন))

Lstat (2) ব্যর্থ করার আরও একটি সৃজনশীল উপায় রয়েছে, এর ম্যান পৃষ্ঠাটি দেখে:

ENOTDIR পথ উপসর্গ একটি কম্পোনেন্ট পথ একটি ডিরেক্টরি নয়।

সুতরাং, কোনও ফাইল অ্যাক্সেস করার চেষ্টা করা যেমন /etc/passwd/nonexistentএই ত্রুটিটি ট্রিগার করা উচিত যা আবার ENOENT ("এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই") থেকে আলাদা এবং আপনার প্রয়োজন অনুসারে হতে পারে।

আর একটি হ'ল:

ENAMETOOLONG পথটি দীর্ঘ।

তবে আপনার এইটির জন্য একটি দীর্ঘ নাম প্রয়োজন হতে পারে (আমি বিশ্বাস করি 4,096 বাইটের সাধারণত সীমাবদ্ধতা থাকে তবে আপনার সিস্টেম / ফাইল সিস্টেমের একটি দীর্ঘতর হতে পারে))

অবশেষে, এগুলির কোনওটিই আপনার পক্ষে আসলে কার্যকর হবে কিনা তা বলা শক্ত । আপনি বলছেন যে আপনি এমন কিছু চান যা "ফাইলের অস্তিত্ব নেই" দৃশ্যের ট্রিগার না করে। সাধারণত এটির অর্থ একটি ENOENT ত্রুটি, বাস্তবে অনেক উচ্চ-স্তরের চেকগুলি lstat (2) থেকে যে কোনও ত্রুটি কেবল "অস্তিত্বহীন" হিসাবে ব্যাখ্যা করবে। উদাহরণস্বরূপ test -eবা [ -e ...]শেল থেকে সমতুল্য কেবল উপরের সমস্তটি "অস্তিত্বহীন" হিসাবে ব্যাখ্যা করতে পারে, বিশেষত যেহেতু এটির একটি পৃথক ত্রুটি বার্তা ফেরত দেওয়ার ভাল উপায় নেই এবং ত্রুটি না ফেরানো ফাইলটিকে বোঝায়, যা অবশ্যই ঘটেনি।


পছন্দ করুন আপডেট করা হয়েছে।
ফিলাব্রেন্ডেন

6

আপনি findনিজেই করতে পারেন

/etcকনফিগারেশন ফাইল ডিরেক্টরিটি একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করে :

sudo find /etc -type f -perm 0400 -user root

আমার সিস্টেমে, এটি কিছুই ফেরায় না।

আপনি কম সীমাবদ্ধ এবং rootমঞ্জুরিপ্রাপ্ত গোষ্ঠী হতে পারেন (কেবল ব্যবহারকারীকেই rootগ্রুপের সদস্য হওয়া উচিত root) এবং এর অনুমতি নিতে সন্ধান করতে পারেন 440:

sudo find /etc -perm 0440 -user root -group root

আমার সিস্টেমে এটি ফিরে আসে:

/etc/sudoers.d/README
/etc/sudoers

সম্পাদনা:

আপনার সম্পাদনার উপর ভিত্তি করে, আপনি এমন একটি ডিরেক্টরি সন্ধান করছেন যা অনুরোধকারী ব্যবহারকারীর ডিরেক্টরি তালিকা রোধ করার জন্য পর্যাপ্ত অনুমতি নেই:

sudo find / -perm o-rwx -type d -user root -group root 

এখানে আমি ডিরেক্টরিগুলি ( -type d) সন্ধান করছি যা অন্যদের ( o-rwx) এর জন্য পঠন-সম্পাদনকারী পেরিট বিটের অভাব রয়েছে এবং এর মালিকানাধীন root:root

প্রযুক্তিগতভাবে, কেবল চালানো ( x) বিটের অনুপস্থিতিতে ডিরেক্টরিতে ডিরেক্টরি তালিকা ( lstat(2)) বিটকানো যায় ।

আউটপুটে আমি /run/systemd/inaccessible/আমার সিস্টেমড ডিআইডি ভিত্তিক সিস্টেমে খুঁজে পেয়েছি ।

ফাইল সংক্রান্ত /proc, /sys, /dev:

  • এই ফাইল সিস্টেমগুলি ভার্চুয়াল এফএস অর্থাত্ এগুলি ডিস্কে নয়, মেমোরিতে থাকে

  • যদি আপনি নির্ভর করতে চান /proc, তবে /proc/1/পিআইডি 1 এর অধীনে কোনও কিছুর উপর নির্ভর করুন , পরবর্তী পিআইডি (প্রসেস) থাকার নিশ্চয়তা না থাকায় নির্ভরযোগ্যতা / ধারাবাহিকতা অর্জনের জন্য কোনও পরবর্তী পিআইডি নয়।


ধন্যবাদ, আমি মনে করি আমার প্রশ্নটি ভুল। আমি এখনও সেগুলিতে পঠিত অ্যাক্সেস ছাড়াই lstat করতে পারি। ফোল্ডারে অ্যাক্সেস সীমাবদ্ধ হতে পারে? (আমি শিরোনামটি সংশোধন করেছি)
বিড়ালছানা

ধন্যবাদ। সঙ্গে find / -type d -perm 0400 -user rootআমি ডিরেক্টরি পাওয়া যায় /proc/20/map_files/, আমি যদি সেই ফোল্ডারটির ভিতরে তৈরি আপ ফাইলের নাম পড়ুন, মত /proc/20/map_files/asdasd, তাহলে এটি সবসময় ব্যর্থ। উবুন্টুতে কি সেই ফোল্ডারটি সর্বদা বিদ্যমান?
বিড়ালছানা

@ ক্রাউচিংকিটেন, ডিরেক্টরিগুলি সম্ভবত /proc/1/নিরাপদ হতে পারে, যেহেতু উদ্যোগ সর্বদা উপস্থিত থাকে। তবে এটি procকোনও নিয়মিত ফাইল সিস্টেম নয়, ক্ষেত্রে এটি গুরুত্বপূর্ণ।
ilkkachu

ধন্যবাদ আমি একটি উত্থাপণ দিয়েছি, কিন্তু অন্য উত্তরটি গ্রহণ করেছি, কারণ তিনি বলেছিলেন যে এটি নিশ্চিত যে /proc/1/fdinfo/0আধুনিক উবুন্টাসে কাজ করে।
বিড়ালছানা

-perm o-rwxমত -perm 0, বিট শুরু দিয়ে সব বন্ধ আছে। এখানে, আপনি চাইবেন ! -perm -1
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.