আমি কেন কেবল পঠনযোগ্য ফাইলটি সংশোধন করতে পারি?


42

সংক্ষিপ্ত প্রশ্ন:

প্রশাসক না হয়েও আমরা কেন :+ w+ q+ ব্যবহার করে ভিমে একটি পঠনযোগ্য ফাইল ম্যানিপুলেট করতে পারি !?

দীর্ঘ প্রশ্ন:

আমার কাছে একটি পাঠ্য ফাইল রয়েছে (myFile.txt) যা কেবল সবার জন্যই পঠনযোগ্য:

navid@navid-ThinkPad-T530:~/ubuntuTest$ ls -l myFile.txt 
-r--r--r-- 1 navid navid 26 Aug 22 21:21 myFile.txt

আমি অ্যাডমিনের সুযোগ না পেয়ে ভিম দিয়ে এটি খুলতে পারি:

navid@navid-ThinkPad-T530:~/ubuntuTest$ vi myFile.txt 

আমি এটিকে সংশোধন করে টিপছি: Esc+ :+ w+ q+ Enterএবং আমি এই ত্রুটি বার্তাটি দেখছি:

E45: 'readonly' option is set (add ! to override)

এখনও অবধি, সমস্ত কিছু বোধগম্য হয়। তবে আমি যখন টিপব: Esc+ :+ w+ q+ !+ Enter, ভিম পরিবর্তনগুলি সংরক্ষণ করে।

আমি উবুন্টু 16.04 এবং ভিআইএম 7.4 ব্যবহার করছি।


1
@ জান্না ফাইলটি যে ডিরেক্টরিটিতে রয়েছে সেটির মালিকানা কি আপনার রয়েছে?
রব

হ্যাঁ এটি অন্যথায় বড় সমস্যা হতে পারে :)
রব

11
একটি ফাইল পরিবর্তন এবং একটি ফাইল প্রতিস্থাপন পৃথক অনুমতি প্রয়োজনীয়তা সঙ্গে দুটি ভিন্ন জিনিস।
ডেভিড শোয়ার্জ

1
আপনি একটি চেহারা আছে করতে চাইবেন এই । এটি মূলত আপনার প্রশ্নের উত্তর দেয় এবং @ ডেভিডশওয়ার্টজ সঠিকভাবে উল্লেখ করেছেন :Modifying a file and replacing a file are two different things
পানাগিওটিস তাবাকিস

@ পানাগিওটিস তাবাকিস খুব সুন্দর এটি খুঁজে পেয়েছেন উজ্জ্বল .. chmod ফাইলটি পুনরায় লেখার জন্য তৈরি করতে আবার নিজের মালিকানাধীন যদি ফিরে আসেন .. এটি ভালবাসুন :)
রব

উত্তর:


58

@ রব যেমন ইতিমধ্যে উল্লেখ করেছে , আপনি কেবল তখনই এটি করতে পারবেন যদি আপনার ফাইলটি অন্তর্ভুক্ত ডিরেক্টরিটিতে লেখার অ্যাক্সেস থাকে। ফাইলটিতে একই জিনিস করার চেষ্টা করা উদাহরণস্বরূপ, /etcব্যর্থ হবে।

এটি কীভাবে vim করছে তা হিসাবে এটি ফাইলটি মুছে ফেলে এবং এটি পুনরায় তৈরি করে। এটি পরীক্ষা করতে, আমি রুটের মালিকানাধীন একটি ফাইল তৈরি করেছি:

echo foo | sudo tee fff

এবং তারপরে vimআপনি যেভাবে বর্ণনা করেছেন সেভাবে ফাইলটি সম্পাদনা করতে এগিয়ে চলেছেন , তবে straceকী হচ্ছে তা দেখার জন্য প্রক্রিয়াটি সংযুক্ত করছেন :

strace vim fff 2> strace.out

আমি তখন যাচাই করে strace.outদেখেছি:

unlink("fff")                           = 0
open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "foasdasdao\n", 11)            = 11

সুতরাং, ফাইলটি প্রথমে মুছে ফেলা হয়েছিল ( unlink("fff")), তারপরে একই নামের একটি নতুন ফাইল তৈরি করা হয়েছিল ( open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)) এবং আমি যে পরিবর্তনগুলি করেছি তা এতে লেখা হয়েছিল ( write(4, "foasdasdao\n", 11))। আপনি যদি বাড়িতে এটি চেষ্টা করে দেখেন তবে এটির মাধ্যমে সম্পাদনা করার পরে vimফাইলটি এখন আপনার হবে এবং মূলের নয়।

সুতরাং, কঠোরভাবে বলতে গেলে, vimএমন কোনও ফাইল সম্পাদনা করছেন যা আপনার কাছে লেখার অ্যাক্সেস নেই। এটি যে ডিরেক্টরিতে আপনার লেখার অ্যাক্সেস রয়েছে তা থেকে একটি ফাইল মুছে ফেলা হচ্ছে এবং তারপরে একটি নতুন ফাইল তৈরি করা হচ্ছে যার কাছে আবার আপনার লেখার অ্যাক্সেস রয়েছে।



8
@CCJ এটি একটি লেখার অপারেশন ডিরেক্টরির কিন্তু ফাইল, কোন। ফাইলগুলিতে লেখার কাজগুলি সেগুলি যা ফাইলের বিষয়বস্তু পরিবর্তন করে। একই টোকেনের সাহায্যে ফাইল তৈরি করা / মুছে ফেলা ডিরেক্টরিতে ক্রিয়াকলাপ লিখতে থাকে যেহেতু আপনি এর বিষয়বস্তু পরিবর্তন করছেন।
টেরডন

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

5
@ পিটারকর্ডস ওম, ঠিক আছে। আপনি যদিও আপনার অভিযোগগুলি ভিআইএম বিকাশকারীদের কাছে পরিচালনা করতে চাইতে পারেন। আমি জিনিসটি ব্যবহার করি না, আমি ইমাস ক্যাম্পে আছি।
টেরডন

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

16

যতক্ষণ আপনি পিতামাতৃত্বের মালিক হন ততক্ষণ আপনি কোনও ফাইল মুছে ফেলতে বা প্রতিস্থাপন করতে পারেন, কারণ আপনি ডিরেক্টরিটির বিষয়বস্তু পরিবর্তন করতে পারেন তাই অনুমতি ছাড়াই কোনও ফাইল প্রতিস্থাপন করতে পারেন :)।

আরএম এর মতো অন্যান্য কমান্ড দিয়ে এটি ব্যবহার করে দেখুন, এটি আপনাকে অনুরোধ করবে তবে আপনি এখনও এটি করতে পারেন। ডিরেক্টরিটি লেখার যোগ্য না হয় এবং এটি এটিকে বন্ধ করে দেওয়া উচিত।

সংযোজন:

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


7
দেখে মনে হচ্ছে ভিআইএম একাধিক কৌশল থেকে বেছে নিয়েছে, প্লে-রাইস-ইন-প্লেস বা আনলিংক + সহ একটি নতুন ফাইল লিখুন including
পিটার কর্ডেস

3
@ পিটারকর্ডস হ্যাঁ এটি আপনি যা বলবেন তা করার জন্য স্পষ্টতই খুব চেষ্টা করবে :) খুব কৌতুকপূর্ণ। :)
রব

16

w!আপনি ব্যবহার করে আসল ফাইলটি মুছে ফেলা হচ্ছে ( যা আপনাকে করার অনুমতি দেওয়া হয়েছে ) এবং পরিবর্তে আপনার সংস্করণটি রচনা করছেন।

আপনার যদি কোনও ডিরেক্টরিতে লেখার অ্যাক্সেস থাকে, আপনি: ডিরেক্টরিটি তৈরি করতে, সরাতে বা মুছতে বা সেই ডিরেক্টরিতে ফাইল মুছতে পারেন।

$ mkdir foo
$ echo hi > foo/file
$ chmod 777 foo
$ chmod 700 foo/file
$ ls -l foo/file 
-rwx------ 1 ravexina ravexina 7 Aug 31 03:19 foo/file

এখন আমাকে আমার ব্যবহারকারীর পরিবর্তন করতে এবং ফাইলটি পরিবর্তন করতে দিন change

$ sudo -u user2 -s
$ vi foo/a # save using w! (I wrote into the file bye)
$ ls -l foo/a
-rwx------ 1 user2 user2 7 Aug 31 03:20 foo/file

এখন সেখানে কি আছে দেখুন:

$ cat foo/file
bye

10

দেখুন :help write-readonly:

                                                        write-readonly
When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a
readonly file.  When 'W' is not present, ":w!" will overwrite a readonly file,
if the system allows it (the directory must be writable).

যেহেতু ডিরেক্টরিতে আপনার লেখার অনুমতি রয়েছে (যার অর্থ আপনি এতে ফাইল তৈরি করতে, মুছতে বা নাম পরিবর্তন করতে পারেন), সিস্টেম এটির অনুমতি দেয় না।


এর ডিফল্ট মান cpoptionsথাকে না W:

                                                'cpoptions' 'cpo' cpo
'cpoptions' 'cpo'       string  (Vim default: "aABceFs",
                                 Vi default:  all flags)
                        global

2

এটি আপনার কাছে ভিআইএমের সতর্কতা যা ইউনিক্সে অনুমতিগুলি কীভাবে কাজ করে তা বিবেচনা করে তুলনামূলকভাবে গুরুত্বপূর্ণ হতে পারে। এর আপাত অদম্যতা হ'ল কারণ ইউনিক্স ফাইল সিস্টেমগুলির ফাইলের আই-নোডে সঞ্চিত ফাইলের অনুমতি রয়েছে। ডিরেক্টরি কাঠামো একরকম পৃথক এবং কেবল এই আই-নোডগুলিকে সংযুক্ত করে। ডিরেক্টরিতে তাদের অনুমতিও রয়েছে যা বলে যে আপনি এতে ফাইলগুলি লিঙ্ক / লিঙ্কমুক্ত করতে পারেন, বা এটি পড়তে বা উপ-ডিরেক্টরিতে যেতে পারেন কিনা। এই নকশাটি একই ফাইলটিকে ডিরেক্টরি কাঠামোর (হার্ড লিঙ্কগুলির মাধ্যমে) বিভিন্ন স্থানে উপস্থিত হতে দেয়। "অ্যাড! টু ওভাররাইড" বলার মাধ্যমে ভিআইএম আপনাকে সতর্ক করার চেষ্টা করছে যে আসল ফাইলটি লিঙ্কযুক্ত হবে (সুতরাং এটি অন্য কোনও জায়গায় অচিহ্নিত থাকবে) এবং নতুন ফাইলটি তৈরি এবং ডিরেক্টরি কাঠামোর মূল স্থানের সাথে সংযুক্ত হবে। যদি মূল ফাইলটির লিঙ্ক-কাউন্ট শূন্যে হ্রাস পায় তবে মূল ফাইলটি মুক্তি দেওয়া হবে, তবে তা না হলে আপনি কার্যকরভাবে ফাইলটি ক্লোনিং করছেন। ফাইলটি খোলার বিষয়টিও লিঙ্ক হিসাবে গণনা করা হয়, সুতরাং যদি কোনও প্রোগ্রাম ফাইলটি খোলেন এবং আপনি "ওভাররাইড করতে" যুক্ত করতে সম্মত হন তবে প্রোগ্রামটি ভিআইএম দিয়ে আপনার ফাইলটিতে পরিবর্তনগুলি দেখতে পাবে না। ফাইলটি কেবল ভিআইএম দ্বারা ডিরেক্টরি থেকে লিঙ্কযুক্ত হয়ে যায় এবং অন্য কোনও প্রোগ্রাম দ্বারা ফাইলটি বন্ধ করার পরে ফাইলটি অন্য কোথাও লিঙ্ক না করা থাকলে মুক্তি পাবে।

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

উদাহরণস্বরূপ, আপনার কাছে ফাইল / হোম / ইউজার 1 / ফু রয়েছে এবং এটি একই ফাইল (যেমন হার্ডলিঙ্কড) / হোম / ইউজার 2 / ফুও এবং ফাইলটি কারও দ্বারা লিখিত হয় না এবং বর্তমানে প্রোগ্রাম পি দ্বারা খোলা হয় (খোলার মাধ্যমে পঠন-লিখন প্রোগ্রাম রুট দ্বারা শুরু)। যদি ব্যবহারকারী 1 এটি ভিম এবং ওভাররাইট দিয়ে খোলে, সে তার নিজের অনুলিপি তৈরি করে এবং আর মূল ফাইলটি আর দেখতে পাবে না। পরবর্তীকালে যদি ব্যবহারকারী 2 ভিমের সাথে তার লিঙ্কটি খোলে এবং এতে লিখিত হয়, এটি আবার লিঙ্কযুক্ত হয়ে যাবে এবং সে অন্য একটি অনুলিপি তৈরি করবে। প্রোগ্রাম পি এখনও মূল ফাইলটি দেখতে পাবে এবং এতে নিখরচায় পড়তে বা লিখতে পারে। প্রোগ্রামটি ফাইলটি বন্ধ করার সাথে সাথে ফাইলটি অদৃশ্য হয়ে যাবে (ফাইল সিস্টেমের মাধ্যমে মুক্ত হবে)।


2

আপনার ভিম সম্পাদক প্রক্রিয়া এবং আপনার ফাইল উভয়ই আপনার বহন করে

 getpwnam("navid")->pw_uid

মালিকানা যাতে আপনি শেল আউট করতে পারে

 :!chmod +w %

এবং আপনি অনুমান করতে পারেন যে একবার একবার এমনকি সহজ

 :!rm %

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

আপনার বড় বোনের ওভাররাইট করার চেষ্টা করুন

 /home/whoopi/.profile

যেমন নাভিড এবং বেটস হ'ল আপনার ভিম আপনাকে আপনার কাঙ্ক্ষিত অস্বীকৃতি দেয়।


কোড সম্পাদনা করার জন্য @ জ্যাঙ্কাকে ধন্যবাদ, যদিও এটি আমার কাছে সামান্য খ্যাতি অর্জনের যোগ্য, যদিও প্রাপ্য।
রোমান সিজবোরা

1

এটি ঠিক কোনও উত্তর নয়, তবে আপনি যদি সত্যিই কোনও ফাইল সেট করতে চান যাতে কেউ এটির পরিবর্তন বা মুছতে না পারে, আপনি এটিকে অপরিবর্তনীয় করে তুলতে পারেন।

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

ফাইল অপরিবর্তনীয় করতে (আপনার প্রয়োজন sudo):

sudo chattr +i myFile.txt

আপনি lsattrএটি ( iফলাফলের চিঠি ) দিয়ে দেখতে পারেন :

$ lsattr myFile.txt
----i--------e-- myFile.txt

ফাইলটি আবার স্বাভাবিক করতে:

sudo chattr -i myFile.txt

স্পষ্ট করার জন্য: যখন কোনও ফাইল অপরিবর্তনীয় তখন এটিকে মুছে ফেলা যায় না, নাম পরিবর্তন করা যায়, পরিবর্তন করা যায় না, এমনকি হার্ড-লিঙ্ক করা যায় না।

এটি পড়া মূল্যবান man chattrকারণ ফাইলগুলিতে বেশ কয়েকটি দরকারী বৈশিষ্ট্য থাকতে পারে।

আপনি "সীমাবদ্ধ মুছে ফেলা" দরকারীও পেতে পারেন। যদি কোনও ফোল্ডারে স্থাপন করা হয় (কোনও ফাইল নয়) তবে এর অর্থ হ'ল যে কেউ ফোল্ডারের মধ্যে একটি ফাইল তৈরি করে তাকে সেই ফাইলটি সংশোধন বা মোছার অনুমতি দেওয়া হয়েছে তবে অন্য কেউ (রুট ছাড়া) নেই is ফোল্ডারে /tmpএই পতাকা সেট রয়েছে। আপনি tপতাকাটির সাথে এটি দেখতে পাবেন /tmp:

$ ls -l --directory /tmp
drwxrwxrwt 10 root root 4096 Sep  6 09:00 /tmp

কোনও ফোল্ডারে সীমাবদ্ধ মুছে ফেলার পতাকা সেট করতে বা সরাতে:

chmod +t myFolder      # Add the restricted deletion flag.
chmod -t myFolder      # Remove the restricted deletion flag.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.