Vi এর অভ্যন্তরে কোনও ফাইলের মধ্যে রুট অনুমতি নেওয়া? [বন্ধ]


245

প্রায়শই কনফিগার ফাইলগুলি সম্পাদনা করার সময়, আমি একটি vi দিয়ে খুলি এবং তারপরে যখন এটি সংরক্ষণ করতে যাই তখন বুঝতে পারি যে আমি টাইপ করি নি

sudo vi filename

ফাইলটি সংরক্ষণের জন্য ভিআই সুডোর সুবিধা দেওয়ার কোনও উপায় আছে কি? কিছুক্ষণ আগে vi সম্পর্কে কিছু স্টাফ সন্ধান করার সময় আমি এই সম্পর্কে কিছু দেখে মনে করেছি, তবে এখন এটি খুঁজে পাচ্ছি না।


সম্ভবত আপনার হোম ডিরেক্টরিতে একটি অনুলিপি সংরক্ষণ করুন এবং এটি পরে "sudo এমভি" করুন
প্যান করুন

উত্তর:


296

% বর্তমান ফাইলের নামের সাথে প্রতিস্থাপন করা হয়েছে, সুতরাং আপনি এটি ব্যবহার করতে পারেন:

:w !sudo tee %

( vimফাইলটি পরিবর্তিত হয়েছে এবং এটি পুনরায় লোড করা হবে কিনা তা জিজ্ঞাসা করবে [L]OK ঠিক আছে না বলে বাছাই করে হ্যাঁ বলুন ))

শর্টকাট হিসাবে, আপনি নিজের কমান্ডটি সংজ্ঞায়িত করতে পারেন। আপনার মধ্যে নিম্নলিখিত রাখুন .vimrc:

command W w !sudo tee % >/dev/null

উপরের সাহায্যে আপনি :W<Enter>ফাইলটি সংরক্ষণ করতে টাইপ করতে পারেন । যেহেতু আমি এটি লিখেছি, আমি এটি করার জন্য একটি ভাল উপায় খুঁজে পেয়েছি (আমার মতে):

cmap w!! w !sudo tee >/dev/null %

এইভাবে আপনি টাইপ করতে পারেন :w!!এবং এটি সম্পূর্ণ কমান্ড লাইনে প্রসারিত হবে, কার্সারটি শেষে রেখে দেওয়া হবে, সুতরাং আপনি %যদি চান তবে আপনার নিজের ফাইলের নামের সাথে প্রতিস্থাপন করতে পারেন।


5
এই gvim কাজ করে? কমান্ডটি চালনার ফলে ভিম পাসওয়ার্ডের জন্য অনুরোধ জানাবে তবে ইনপুট গ্রহণ করবে না। এটি শেষ পর্যন্ত দুটি চেষ্টা করে বেরিয়ে আসে এবং বলে:sudo: 1 incorrect password attempt
সেমিচিন্টি

আমি জিভিমকে অন্যরকম আচরণ করার কোন কারণ দেখতে পাচ্ছি না ... আপনি কি নিশ্চিত সুডো নিজে থেকেই সঠিকভাবে কাজ করছেন?

কোনও নতুন ফাইল সংরক্ষণ করতে যদি আপনার রুট সুবিধাগুলির প্রয়োজন হয় তবে নতুন ফাইলটির নাম (পথ সহ) সহ% কে প্রতিস্থাপন করুন।
gvkv

কিছু সময়, আপনার ব্যবহারকারীকে প্রথমে sudoer ফাইল যুক্ত করতে হবে, মূল ব্যবহারকারী লিখুন এবং /etc/sudoersফাইলটি খুলুন , your_username ALL=(ALL) ALLলাইনের নীচে যুক্ত করুন root ALL=(ALL) ALL, প্রস্থান করুন এবং সংরক্ষণ করুন।
শীতল করা

1
@ কুলিস্টিং: 1) আপনার আরও হাজার হাজার কাজ করতে হবে ... আমরা সেগুলি সব তালিকাবদ্ধ করতে পারি না। 2) আপনার সর্বদা ব্যবহার করা উচিত visudo

32

সাধারণভাবে, আপনি vi প্রক্রিয়াটির কার্যকর ব্যবহারকারী আইডি পরিবর্তন করতে পারবেন না, তবে আপনি এটি করতে পারেন:

:w !sudo tee myfile

1
:w !sudo tee % >/dev/nullবা :w !sudo dd of=%ফাইলটি সংরক্ষণ করার সাথে সাথে ফাইলটির বিষয়বস্তু প্রতিধ্বনিত হওয়া এড়ানো উচিত।
জামেসান

এটি কীভাবে কাজ করে তা ব্যাখ্যা করতে পারেন? আমি তাকিয়ে দেখলাম teeএটি একটি ইউনিক্স পাইপ কমান্ড, এবং !একটি শেল কমান্ড সন্নিবেশ করিয়েছে। কি :wমান আউট, যা দিয়ে পাইপ পরার জন্য লেখা tee?
এরিক হু

4
@ এরিক, ঠিক আছে "টি মাইফাইল" কমান্ডটি স্টাইডিনকে মাইফাইলে অনুলিপি করবে। "সুডো টি মাইফাইল" চালানো একই কাজ করবে, তবে যেহেতু টি প্রক্রিয়া রুটের মালিকানাধীন, মাইফাইলে একইভাবে রুটের মালিকানাধীন হবে। দ্বি দিকে, ": w! কিছু কমান্ড লাইন" সমস্ত লাইন "কিছু কমান্ড লাইন" এ পাইপ করবে।
মার্ক হ্যারিসন

16

সাধারণ ক্যাভেটস

কেবলমাত্র পঠনযোগ্য ফাইল সমস্যার আশেপাশের সবচেয়ে সাধারণ পদ্ধতি হ'ল একটি বাস্তবায়ন ব্যবহার করে সুপার-ব্যবহারকারী হিসাবে বর্তমান ফাইলটিতে একটি পাইপ খোলার sudo tee। তবে, আমি ইন্টারনেটে যে সর্বাধিক জনপ্রিয় সমাধান খুঁজে পেয়েছি তার মধ্যে বেশ কয়েকটি সম্ভাব্য ক্যাভেটের সংমিশ্রণ রয়েছে:

  • পুরো ফাইলটি টার্মিনালে এবং সেই সাথে ফাইলটিতে লেখা হয়। বড় ফাইলগুলির জন্য এটি ধীর হতে পারে, বিশেষত ধীর নেটওয়ার্ক সংযোগের চেয়ে বেশি।
  • ফাইলটি এর মোড এবং অনুরূপ বৈশিষ্ট্যগুলি হারিয়ে ফেলে।
  • অস্বাভাবিক অক্ষর বা স্পেস সহ ফাইলের পথগুলি সঠিকভাবে পরিচালনা করা যায় না।

সলিউশন

এই সমস্ত সমস্যা সম্পর্কে জানতে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

এগুলি সংক্ষিপ্তভাবে সংক্ষিপ্ত করা যেতে পারে:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

ব্যাখ্যা

:আদেশ শুরু; কমান্ড প্রবেশ করাতে আপনাকে এই অক্ষরটি স্বাভাবিক মোডে টাইপ করতে হবে। এটি স্ক্রিপ্টগুলিতে বাদ দেওয়া উচিত।

sil[ent]কমান্ড থেকে আউটপুট দমন করে। এই ক্ষেত্রে, আমরা কমান্ডটি Press any key to continueচালানোর পরে প্রদর্শিত-অনুরূপ প্রম্পটটি বন্ধ করতে চাই :!

exec[ute]কমান্ড হিসাবে একটি স্ট্রিং কার্যকর করে। আমরা কেবল চালাতে পারি না :writeকারণ এটি প্রয়োজনীয় ফাংশন কলটি প্রক্রিয়া করে না।

!:!কমান্ডটি উপস্থাপন করে : একমাত্র আদেশ যা :writeগ্রহণ করে। সাধারণত, :writeকোন ফাইল পাথ লিখতে হয় তা গ্রহণ করে। :!নিজের শেলটিতে একটি কমান্ড চালায় (উদাহরণস্বরূপ, ব্যবহার করে bash -c)। এর সাহায্যে :writeএটি শেলের কমান্ডটি চালাবে এবং তারপরে সম্পূর্ণ ফাইলটি লিখবে stdin

sudoআপনি এখানে আছেন যেহেতু সুস্পষ্ট হওয়া উচিত। কমান্ডটি সুপার-ইউজার হিসাবে চালান। নেট কীভাবে এটি কাজ করে সে সম্পর্কে প্রচুর তথ্য রয়েছে।

teestdinপ্রদত্ত ফাইলে পাইপ । :writeএতে লিখবে stdin, তারপরে সুপার-ব্যবহারকারী teeফাইল সামগ্রীগুলি গ্রহণ করবে এবং ফাইলটি লিখবে। এটি কোনও নতুন ফাইল তৈরি করবে না - কেবল সামগ্রীগুলি ওভাররাইট করে - সুতরাং ফাইলের মোড এবং বৈশিষ্ট্যগুলি সংরক্ষণ করা হবে।

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

@%%নিবন্ধের বিষয়বস্তু পড়ে , যা বর্তমান বাফারের ফাইলের নাম ধারণ করে। এটি অগত্যা একটি নিখুঁত পাথ নয়, সুতরাং আপনি বর্তমান ডিরেক্টরিটি পরিবর্তন করেন নি তা নিশ্চিত করুন। কিছু সমাধানে, আপনি বাণিজ্যিক-এ-প্রতীক বাদ দেওয়া দেখতে পাবেন। অবস্থানের উপর নির্ভর করে, %একটি বৈধ এক্সপ্রেশন এবং এটি %রেজিস্টার পড়ার মতোই প্রভাব ফেলে । অন্য অভিব্যক্তির ভিতরে নেস্টেড শর্টকাটটি সাধারণত অনুমোদিত নয়, যেমন: এই ক্ষেত্রে।

>NULএবং প্ল্যাটফর্মের নাল ডিভাইসে >/dev/nullপুনর্নির্দেশ করুন stdout। যদিও আমরা কমান্ডটি নিঃশব্দ করে রেখেছি, আমরা stdinপাইপিংয়ের সাথে যুক্ত সমস্ত ওভারহেডকে উইম-এর কাছে ফিরিয়ে আনতে চাই না - সর্বোত্তম এটি যত তাড়াতাড়ি সম্ভব ডাম্প করা। NULডস, এমএস-ডস এবং উইন্ডোজের নাল ডিভাইস, কোনও বৈধ ফাইল নয়। উইন্ডোজ 8 অনুসারে NUL- এ পুনঃনির্দেশের ফলস্বরূপ NUL নামের একটি ফাইল লিখিত হবে না। ফাইল এক্সটেনশন সহ বা ছাড়াই আপনার ডেস্কটপে NUL নামে একটি ফাইল তৈরি করার চেষ্টা করুন: আপনি এটি করতে অক্ষম হবেন। (উইন্ডোতে আরও বেশ কয়েকটি ডিভাইসের নাম রয়েছে যা জানার জন্য উপযুক্ত হতে পারে))

~ / .Vimrc

প্ল্যাটফর্ম-এর উপর নির্ভরশীল

অবশ্যই, আপনি এখনও সেগুলি মুখস্ত করতে এবং প্রতিবার এগুলি টাইপ করতে চান না। একটি সহজ ব্যবহারকারী কমান্ডে উপযুক্ত কমান্ডটি মানচিত্র করা অনেক সহজ। পসিক্সে এটি করতে আপনি নিজের ~/.vimrcফাইলটিতে নিম্নলিখিত লাইনটি যুক্ত করতে পারেন, এটি ইতিমধ্যে উপস্থিত না থাকলে এটি তৈরি করে:

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

এটি আপনাকে সুপার-ব্যবহারকারীর অনুমতি সহ বর্তমান ফাইলটি লিখতে ডাব্লু (কেস-সংবেদনশীল) কমান্ডটি টাইপ করতে দেয় - আরও সহজ।

স্বাধীন প্ল্যাটফর্ম

আমি একটি প্ল্যাটফর্ম-স্বতন্ত্র ~/.vimrcফাইল ব্যবহার করি যা কম্পিউটার জুড়ে সিঙ্ক্রোনাইজ হয়, তাই আমি আমার সাথে বহু-প্ল্যাটফর্মের কার্যকারিতা যুক্ত করেছি। এখানে ~/.vimrcকেবলমাত্র প্রাসঙ্গিক সেটিংস সহ একটি রয়েছে:

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF

আপনি যদি সি: \ দেব ull নাল এ আসলে একটি বিশ্ব লিখনযোগ্য ফাইল তৈরি করে উইন্ডোজ ট্রিপ আপ করেন?
পল স্টেলিয়ান

1
@ পলস্টেলিয়ান সম্ভব, তবে অসম্ভব। আপনি সহজেই এই কোডটি বিভিন্ন প্ল্যাটফর্ম এবং পরিস্থিতিতে অ্যাকাউন্টে প্রসারিত করতে পারেন। বাস্তবে, আপনি উইন্ডোজের এমন অবস্থার মুখোমুখি হওয়ার সম্ভাবনা sudoনেই যেখানে উপস্থিত রয়েছে তবে /dev/nullতাই নয় , আপনি যদি সত্যিকারের ক্রস-প্ল্যাটফর্ম সমর্থন চান তবে আপনাকে ফ্যানসিয়ার পেতে হবে। এটি আরও পরিচিতি - চিন্তার জন্য খাদ্য। :)
জেনেক্সার

11

আপনি যদি ভিম ব্যবহার করছেন তবে sudo.vim নামে একটি স্ক্রিপ্ট উপলব্ধ । যদি আপনি দেখতে পান যে আপনি এমন কোনও ফাইল খোলেন যা পড়ার জন্য আপনার রুট অ্যাক্সেসের প্রয়োজন হয়, টাইপ করুন

: ই সুডো:%
ভিম বর্তমান ফাইলের নামের সাথে% কে প্রতিস্থাপন করে এবং sudo:sudo.vim স্ক্রিপ্টকে পড়া এবং লেখার জন্য দায়িত্ব নিতে নির্দেশ দেয়।


4
আমি এই স্ক্রিপ্টটি ব্যবহার করার পরামর্শ দেব না কারণ এটি ফাইলের নামগুলি পালানোর সাথে সাথে যথাযথ সতর্কতা নেয় না।
জামেসান

7

রায়ান এর পরামর্শ সাধারণত ভাল, তবে, পদক্ষেপ 3 অনুসরণ করে, অস্থায়ী ফাইল সরানো না; এটির ভুল মালিকানা এবং অনুমতি থাকবে। পরিবর্তে, sudoeditসঠিক ফাইল এবং :rঅস্থায়ী ফাইলের বিষয়বস্তুগুলিতে (ব্যবহার বা এর মতো) পড়ুন।

পদক্ষেপ 2 অনুসরণ করে, :w!ফাইলটি লিখিতভাবে বাধ্য করতে ব্যবহার করুন ।


3

আপনি যখন কোনও ফাইলে সন্নিবেশ মোডে যান তখন আপনাকে সম্পাদনার জন্য সুডো অ্যাক্সেসের দরকার হয়, আপনি একটি স্থিতি বার্তা পেয়ে যাবেন

-- INSERT -- W10: Warning: Changing a readonly file

আমি যদি এটি মিস করি তবে আমি সাধারণত করি

:w ~/edited_blah.tmp
:q

..then ..

sudo "cat edited_blah.tmp > /etc/blah"

..or ..

sudo mv edited_blah.tmp /etc/blah

এটি করার খুব কম উপায় সম্ভবত আছে, তবে এটি কার্যকর হয়।


cat $ tmp> $ টার্গেটটি সৃজনশীল, তবে কেবলমাত্র এমডি ফাইল এমডি না করার কোনও কারণ আছে?
ওজরাক

ভাল কথা .. সুডো ক্যাট কিছু </ etc / blah - এও একটি বড় সমস্যা ছিল - যা ফাইলটিকে বিড়াল করতে sudo ব্যবহার করবে, তারপরে নিয়মিত ব্যবহারকারী / / etc / blah লিখতে (যা কাজ করবে না) .. এটি স্থির করে উত্তরটি, এবং আপনার আরও ভাল sudo
এমভি

এমভি পরামর্শটি অনুমতিগুলি সংরক্ষণ করে না।
পল স্টেলিয়ান

1

একটি দ্রুত গুগল এই পরামর্শটি বলে মনে হচ্ছে:

  1. এটি কেবল পঠনযোগ্য হলে সম্পাদনা করার চেষ্টা করবেন না।
  2. আপনি ফাইলটিতে অনুমতিগুলি পরিবর্তন করতে সক্ষম হতে পারেন। (এটি আপনাকে সংরক্ষণ করতে দেয় কি না তা পরীক্ষা-নিরীক্ষার উপর নির্ভর করে))
  3. আপনি যদি এখনও যাইহোক সম্পাদনা করেন, একটি অস্থায়ী ফাইলে সংরক্ষণ করুন এবং তারপরে এটি সরান।

http://ubuntuforums.org/showthread.php?t=782136


1

এই প্রশ্নের উত্তর আসার পরে এখানে আরও একটি উপস্থিত হয়েছে যা সুডোএডিট নামে একটি প্লাগইন যা SudoRead এবং SudoWrit ফাংশন সরবরাহ করে যা ডিফল্টরূপে sudo প্রথমে ব্যবহার করার চেষ্টা করবে এবং su যদি এটি ব্যর্থ হয়: http://www.vim.org/scriptts/ script.php? SCRIPT_ID = 2709


0

আমার এটি আমার। / .Bashrc এ রয়েছে:

alias svim='sudo vim'

এখন যখনই আমার একটি কনফিগার ফাইল সম্পাদনা করতে হবে আমি কেবল এটি স্ভিম দিয়ে খুলি।


2
sudoeditকমান্ড পছন্দসই হবে যেহেতু এটি রুট হিসাবে চলমান তেজ প্রয়োজন হয় না।
জামেসান

2
এটি এখনও আপনাকে স্যুইমের পরিবর্তে ভিমে বাঁধতে থামায় না যা এই ওপিতে বাদ পড়ে।
ScaryAardvark

3
-1, এটি কেবল "একটি ফাইল খোলার সময় সুডো টাইপ করতে মনে রাখবেন" বলছেন, ওপি তারা vi এর অভ্যন্তরে কীভাবে মূল সুযোগগুলি পেতে পারে তা জানতে চায়।
ব্র্যাড কোচ

-2

আপনি যে দ্রুত হ্যাক বিবেচনা করতে পারেন তা হ'ল আপনি যে ফাইলটি সম্পাদনা করছেন তাতে একটি chmod করছেন, ভিমের সাহায্যে সংরক্ষণ করুন এবং তারপরে chmod ফাইলটি মূলত কী ছিল to

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

অবশ্যই সুরক্ষা সম্পর্কে উদ্বিগ্ন এমন সিস্টেমে আমি এই পদ্ধতির প্রস্তাব দিচ্ছি না, কারণ কয়েক সেকেন্ডের মধ্যে কেউ আপনাকে বুঝতে না পেরে ফাইলটি পড়তে / পরিবর্তন করতে পারে।

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