কোনও ফাইলের লেখার অ্যাক্সেসের জন্য অ-আক্রমণাত্মকভাবে কীভাবে পরীক্ষা করবেন?


20

শেল স্ক্রিপ্টে, ফাইলটি পরিবর্তনের চেষ্টা না করে আমি কীভাবে সহজে এবং অ-আক্রমণাত্মকভাবে কোনও ফাইলের লেখার অ্যাক্সেসের জন্য পরীক্ষা করব?

আমি আউটপুট পার্স করতে পারলাম stat, তবে এটি দেখতে জটিল এবং সম্ভবত ভঙ্গুর মনে হচ্ছে, যদিও বাস্তবায়ন এবং সময় জুড়ে স্ট্যাটাস আউটপুট কতটা পৃথক তা আমি নিশ্চিত নই।

আমি ফাইলটির শেষের দিকে সংযোজন করতে এবং দেখতে পেলাম যে এটি সফল হয় কিনা, তবে এটি সম্ভবত বিপজ্জনক, দুটি কারণে আমি ভাবতে পারি:

  1. আমাকে এখন সংযোজনটি সরিয়ে ফেলতে হবে এবং যদি অন্য কোনও প্রক্রিয়া ফাইলটিতে লিখতে পারে তবে তা অবিলম্বে তুচ্ছ হয়ে উঠবে কারণ আমার লাইন আর শেষ নয় last
  2. ফাইলটি পড়ার যে কোনও প্রক্রিয়ার সেই ফাইলের বিষয়বস্তুগুলিতে স্বেচ্ছাসেবী প্রয়োজনীয়তা থাকতে পারে এবং আমি সম্ভবত সেই অ্যাপ্লিকেশনটি ভেঙে ফেলেছি।

উত্তর:


29

কেবল - utillity এর wপতাকাটি ব্যবহার করুন test:

[ -w /path/to/file ] && echo "writeable" || echo "write permission denied"

মনে রাখবেন আপনি যদি পরে ফাইলটিতে লিখতে যান তবে এটি এখনও সম্ভব যে আপনি এটিতে লিখতে পারবেন না। ফাইল সরানো হয়ে থাকতে পারে, অনুমতি পরিবর্তিত হতে পারে, ইত্যাদি এটি ঘটতে পারে যে -wডিটেক্ট করে অনুমতি লিখতে কিন্তু কিছু অন্যান্য ফ্যাক্টর হস্তক্ষেপ করে ফাইল লিখনযোগ্য নয় করতে


1
অবশ্যই! আমার পরীক্ষার ম্যান পেজটি পরীক্ষা করার চিন্তা করা উচিত ছিল। ধন্যবাদ.
ব্যবহারকারী 50849

1
@qweilun এটি একটি শেল builtin, কিন্তু আপনি মাধ্যমে man পৃষ্ঠা প্রদর্শন করতে পারেন man testবাman [
বিশৃঙ্খলার

5
@ চাওস এটি শেল বিল্টিন এবং একটি বহিরাগত সম্পাদনযোগ্য উভয়ই - চেষ্টা করুনtype -a
ভোলকার সিগেল

1
উত্সটিtest ব্যবহার করে euidaccessযা অনুমতি বিটগুলি কেবল পরীক্ষা করে । লেখার অ্যাক্সেস নিষিদ্ধ করতে পারে এমন অন্যান্য কারণ (যেমন সেলিলাক্স) নেই?
জামনুট

2
@ ব্রোস্লো, &&এবং ||সমান নজরে রয়েছে । এগুলি বাম থেকে ডানে মূল্যায়ন করা হয়।
ওয়াইল্ডকার্ড

11

অন্য পদ্ধতি:

if >> /path/to/file
then
    echo "writeable"
else
    echo "write permission denied"
fi

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

সাবধান থাকুন যে এটি যদি একটি অস্তিত্ব না থাকে তবে এটি একটি খালি ফাইল তৈরি করে।

কমান্ডটির -wঅপারেটর কেবল testএকটি কাজ করবে stat এবং তারপরে এটির অ্যাক্সেস থাকা উচিত বলে মনে হচ্ছে কিনা তা চেষ্টা করার চেষ্টা করবে। আমার বিকল্পটি (উপরে) testকিছু বিশেষ অবস্থার চেয়ে পদ্ধতির চেয়ে বেশি নির্ভরযোগ্য , কারণ এটি শেলের পরিবর্তে কার্নেল দ্বারা অ্যাক্সেস চেক করতে বাধ্য করে। উদাহরণ স্বরূপ,

  • যদি ফাইলটি একটি ইউনিক্স নন ফাইল সিস্টেমে থাকে - বিশেষত যদি এটি একটি অ-ইউনিক্স ফাইল সার্ভার থেকে দূরবর্তীভাবে মাউন্ট করা থাকে - কারণ statএটি এমন একটি মোডের মান দিতে পারে যা বিভ্রান্তিকর।
  • যদি ফাইলটি এমন কোনও ফাইল সিস্টেমে থাকে যা কেবল পঠনযোগ্য জন্য মাউন্ট করা থাকে।
  • যদি ফাইলটিতে একটি এসিএল থাকে এবং মোডটি এটির মতো করে তোলে আপনার অ্যাক্সেস করা উচিত তবে এসিএল এটি অস্বীকার করে, বা বিপরীতে।
  • যদি কিছু সুরক্ষা কাঠামো (AppArmor, SELinux,…) ফাইলটিতে অ্যাক্সেস অস্বীকার করে।

3
আমি সবেমাত্র এটি পরীক্ষা করেছি (দেবিয়ানতে)। উভয়ই সময় পরিবর্তন করা হয়নি এবং যে কোনও ইউনিক্সে এটি কাজ করা উচিত। অ্যাক্সেসের সময়টি কেবলমাত্র যদি আপনি ফাইল থেকে পড়ে থাকেন তবে আপডেট করা উচিত, আপনি যখন ফাইলটিতে লিখেন তবে পরিবর্তিত সময়টি আপডেট করা উচিত। এই কোড না। @ শ্যাওয়ার্ন: আপনার বক্তব্যের জন্য আপনার কাছে কি রেফারেন্স রয়েছে? আপনারা কেউ চেষ্টা করেছেন?
জি-ম্যান

2
পিএস @ মুরু: আমি কেবল touchনিজের মালিকানাধীন একটি ফাইল চেষ্টা করেছি তবে এতে লেখার অ্যাক্সেস নেই এবং এটি সফল হয়েছিল। আমি অনুমান করি যে এটি chmodফাইলটি এবং chmodএটি আবার ফিরে আসবে। সুতরাং touchপ্রশ্নের উত্তর হিসাবে একেবারে অকেজো বলে মনে হচ্ছে।
জি-ম্যান বলছেন 'মনিকাকে পুনরায় ইনস্টল করুন'

2
@ জি-ম্যান আহ, এটি আকর্ষণীয়। vimকেবলমাত্র পঠনযোগ্য ফাইলে লিখতে বাধ্য করার সাথে সাথে অনুমতিগুলি দ্রুত পরিবর্তন করার আইআইআরসি-র আচরণ রয়েছে। আমি চেক করেছিলাম strace, touchএর সাথে openব্যর্থ হয়েছে EACCES, তবে পরবর্তী কলটি utimensatসফল হয়, এজন্য আমি মনে করি touchপুরোটির সাফল্যের সাথেই বেরিয়ে আসে।
মুড়ু

2
@ মুরু: এটি যাচাই করার জন্য ধন্যবাদ। utimensat(2)বলে, " অনুমতিসমূহ প্রয়োজনীয়তা: 1. লেখার অ্যাক্সেস (বা) 2. কলার এর কার্যকর ব্যবহারকারী আইডি, ফাইলের মালিক মেলানো ...।"
জি-ম্যান বলেছেন 'পুনর্বহাল মনিকা'

3
>> fileচ্যাম্পিনাকের মতো অন্যান্য সমস্যাগুলি: পোর্টেবল নয় (উদাহরণস্বরূপ, zsh এ NULLCMD চালায়), true >> fileপরিবর্তে ব্যবহার করুন। এবং যদি ফাইলটি একটি নামযুক্ত পাইপ হয় তবে এটির বাজে পার্শ্ব প্রতিক্রিয়া রয়েছে।
স্টাফেন চেজেলাস

3

জি-মানুষ সঠিক: [ -w ]করা হবে না সবসময় সত্যি বলছি। অ-বিদ্যমান ফাইলটি মোকাবেলা করতে এবং শেল থেকে অনুমতি প্রত্যাখ্যানের বার্তা:

( [ -e /path/to/file ] && >> /path/to/file ) 2> /dev/null && 
  echo writable || 
  echo not writable

আপডেট : ভয়ংকর দেখাচ্ছে, তাই না? ঠিক আছে। হুম ... কীভাবে এটি বাক্যবিন্যাস করবেন ... এটি ব্যবহার করবেন না, যদি না আপনি পুরোপুরি জানেন না যে আপনি আশানুরূপভাবে কাজ করার অনুরোধ করছেন এমন পরিস্থিতিতে আছেন। স্টিফেনের মন্তব্য দেখুন।

তাহলে উপসংহারটা কী? এমনকি [ -w ]সত্য না বললেও, এটি একটাই আদেশ যা কাজটি করার উদ্দেশ্যে করা হয়েছে। যদি এটি না হয় তবে ভাল, আমরা এটির জন্য দোষ দেব, বাগ রিপোর্ট লিখব এবং এটি ভবিষ্যতে কাজ করবে। এটি যে অবস্থার অধীনে কাজ করে এবং ব্যবহার করছে তা আরও ভাল পরীক্ষা করুন [ -w ]; বিশেষ ক্ষেত্রে বিশেষ কোড লিখুন। কাজের ক্ষেত্রগুলির নিজস্ব শর্ত রয়েছে।

[ -w /path/to/file ]

সেরা অগ্রিম হয়


3
যদি ফাইলটি একটি নামযুক্ত পাইপ হয় তবে তা যদি না পড়ে থাকে তবে এটি স্তব্ধ হয়ে যাবে এবং পাঠক থাকলেও বাজে পার্শ্ব প্রতিক্রিয়া দেখা দিতে পারে। test -wবেশিরভাগ বাস্তবায়নে access(2)অনুমতিগুলি পরীক্ষা করার জন্য পর্যাপ্ত পরিমাণে ব্যবহার করা উচিত।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.