Vim ফাইল অনুমতি বাতিল করতে পারেন?


8

আমি অন্যদিন যথারীতি ভিম ব্যবহার করছিলাম, যখন আমি কিছু অদ্ভুত কিছু লক্ষ্য করেছি। আমি যা করেছি তা এখানে:

~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile

তারপরে আমি একটি পরিবর্তন করেছি, এবং সংরক্ষণ করে ছেড়ে দিয়েছি :wq। বেশ স্বাভাবিক. তবে, তবে:

~$ sudo chown root:root testfile
~$ sudo chmod 644 testfile
~$ sudo -k
~$ ls -l | grep testfile
-rw-r--r-- root root 0 Jul 23 10:02 testfile
~$ vim testfile

সুতরাং মূলের r / w অ্যাক্সেস থাকা উচিত এবং অন্য প্রত্যেকেরই কেবল পঠন উচিত। ফাইলটি সম্পাদনা করুন, সংরক্ষণের চেষ্টা করুন - আপনি পারবেন না। দুর্দান্ত, ইচ্ছাকৃত কাজ করছে। তবে, আপনি যদি :w!এটির সাথে সংরক্ষণ করেন , ভিম কোনওভাবে ফাইলের মালিকানা পরিবর্তন করে ব্যবহারকারীর নাম: ইউজারগ্রুপ এবং ফাইলটি সংরক্ষণ করা হবে। এমনকি যদি আপনি এটি করেন:

~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile

আপনি এখনও এর সাথে ওভাররাইট করতে পারেন :w!! কি হচ্ছে? কীভাবে এই জাতীয় ফাইলের মালিকানা এবং অনুমতি আইন ভঙ্গ করতে পারে? আমি ভিএম-তে সহায়তার পৃষ্ঠাটির দিকে তাকিয়ে :help :wএটি খুঁজে পেয়েছি:

:w[rite]! [++opt]    Like ":write", but forcefully write when 'readonly' is set or there is another reason why writing was refused.
                     Note: This may change the permission and ownership of the file and break (symbolic) links. Add the 'W' flage to 'cpoptions' to avoid this.

আমি আগে যখন ভিএম-তে কোনও ফাইল লিখতে অক্ষম ছিলাম, তাই আমার অনুমানের সত্যিকারের হৃদয়টি আমি অনুমান করি যে আমি কীভাবে কোনও ফাইলকে ভিএম-র দ্বারা অক্ষম-সক্ষম করতে পারি এবং কেন এটি ফাইলের ভিত্তিতে নয়? সিস্টেমের অনুমতি, যেমনটি আমি প্রত্যাশা করতাম, এবং অন্যান্য সম্পাদকরা (gedit, ন্যানো) ব্যবহার করতে পারে না এমন ফাইলটি সম্পাদনা করার জন্য vim কী পদ্ধতি ব্যবহার করছে?

সম্পাদনা: আমি যে কম্পিউটারটি চেষ্টা করেছিলাম তা লিনাক্স কার্নেলটি 3.15.5-2-ARCH ব্যবহার করছে। ভিমের সংস্করণ নম্বরটি 7.4.373-1, এবং এটি ইনস্টল করা একটি pacman- আমি কোনও বিশেষ বিকল্প দিয়ে এটিকে স্ক্র্যাচ থেকে সংকলন করি নি।



আমি প্রশ্নটিতে কমান্ডগুলি ব্যবহার করে আবার চেষ্টা করেছি এবং এটি একইভাবে ঘটেছে। আমি আমার কম্পিউটার সম্পর্কে বিশদ যুক্ত করতে প্রশ্নটি সম্পাদনা করব যদিও এটি মনে হচ্ছে এটি প্ল্যাটফর্ম নির্ভর dependent
zrneely

আমার প্রথম কুণ্ডলীটি হ'ল আপনাকে যে ডিরেক্টরিতে লেখার অ্যাক্সেস রয়েছে সেই ডিরেক্টরিতে ফাইলগুলির মালিকানা পরিবর্তন করার অনুমতি দেওয়া হচ্ছে। তবে মনে হয় এটি তেমনটি নয়CAP_CHOWNকল করা প্রয়োজন chown(2)। যাইহোক, আমি ভিম .4.৪ সহ ডেবিয়ানে পুনরুত্পাদন করতে পারি।
বব

উত্তর:


10

আমি দেখতে পাচ্ছি যে আপনার বর্তমান পথটি ~আপনার ব্যবহারকারীর হোম ডিরেক্টরি। আপনার সেই ডিরেক্টরিতে লেখার অনুমতি থাকা উচিত।

এটিকে অন্যভাবে ভাবুন - আপনি যদি ডিরেক্টরিটিতে অনুমতি পড়েন এবং লিখেন, তবে ফাইলটি অনুলিপি করা থেকে, পুরানোটিকে মুছতে এবং নতুন অনুমতিটি দিয়ে আলাদা আলাদা অনুমতি দিয়ে নতুন নামকরণ করা থেকে আপনাকে কী বাধা দিচ্ছে?

ভীম ঠিক এটাই করে!


যদি আপনি স্ট্রেসের নীচে ভিএম চালান, উদাহরণস্বরূপ:

open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)
lstat("testfile", {st_mode=S_IFREG|0644, st_size=10, ...}) = 0
getuid()                                = 1000
unlink("testfile")                      = 0
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
write(3, "ffjidfjds\n", 10)             = 10
fsync(3)                                = 0
close(3)                                = 0
chmod("testfile", 0644)                 = 0

এই লগের উপর ভিত্তি করে, আমি নিম্নলিখিত প্রক্রিয়াটিতে অনুমান করতে পারি:

কিছু পূর্বের অনুমতি চেক (এবং chownপ্রচেষ্টা ইত্যাদি) ব্রেভিটির জন্য বাদ দেওয়া হয়েছে।

  1. open লেখার জন্য ফাইলটি খোলার চেষ্টা (ব্যর্থ: অনুমতি অস্বীকার)
  2. lstat ফাইলের মালিক পরীক্ষা করুন
  3. getuuid ফাইলের মালিকের সাথে তারা মেলে কিনা তা দেখতে বর্তমান ব্যবহারকারী আইডি দেখুন to
  4. unlink ফাইলটি মুছুন (এটি অনুমোদিত কারণ ডিরেক্টরিতে অনুমতি লেখার অনুমতি রয়েছে)
  5. open একই নামে একটি নতুন ফাইল তৈরি করুন
  6. write ফাইলের বিষয়বস্তু (আগে পড়ুন, আমি কিছু জিব্রিশ টাইপ করেছি)
  7. fsync ফাইলটি ডিস্কে ফ্লাশ করুন (সত্যই গুরুত্বপূর্ণ নয়)
  8. close
  9. chmod পুরানোটির মতো দেখতে নতুন ফাইলের অনুমতিগুলি পরিবর্তন করুন - এটি এখন নতুন মালিক হিসাবে দেখাবে।

ঠিক আছে ধন্যবাদ. আমি খুশি যে আমি এই বিষয়টি বুঝতে পেরেছি। সুতরাং ডিরেক্টরিতে যদি আমার কাছে লেখার অনুমতি না থাকে তবে আমি ব্যবহার করতে পারব না :w!, যা বোঝা যায়।
zrneely

এছাড়াও, স্ট্রের তথ্যটি সত্যই সহজলভ্য - ভবিষ্যতে আমার নিজের তদন্তের জন্য এখন আমার কাছে অন্য একটি সরঞ্জাম রয়েছে।
zrneely

1
@Zrneely এর জন্য একটি টিপ strace: -oএকটি ফাইলে আউটপুট লিখতে বিকল্পটি ব্যবহার করুন; অন্যথায় এটির vimফলাফলের সাথে সংঘর্ষ হয় । লেখার অনুমতি হিসাবে, আমি এটা দিয়ে ডিরেক্টরির অনুমতি পরীক্ষণ দেখতে না statকিন্তু এটা করে একটি ফাইল তৈরি করতে প্রচেষ্টা (নামকরণ 4913বর্তমান ডিরেক্টরির মধ্যে, র্যান্ডম মনে হয়) এবং তারপর এটা সরিয়ে দিন।
বব

দেখে মনে 4913হচ্ছে আসলে এটির প্রথম নামটি চেষ্টা করে এবং এর উদ্দেশ্য এটি করার পর্যাপ্ত অনুমতি আছে কিনা তা পরীক্ষা করা। দেখুন: bugzilla.redhat.com/show_bug.cgi?id=427711#c6 এবং groups.google.com/forum/#!topic/vim_dev/sppdpElxY44
বব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.