الحصول على أذونات الجذر على ملف داخل السادس ؟

StackOverflow https://stackoverflow.com/questions/1005

  •  08-06-2019
  •  | 
  •  

سؤال

في كثير من الأحيان أثناء تحرير ملفات التكوين ، سأفتح واحد مع السادس ثم عندما أذهب إلى حفظه أدرك أنني لم اكتب

sudo vi filename

هل هناك أي طريقة لإعطاء السادس امتيازات سودو حفظ الملف ؟ يبدو لي أن أذكر شيئا عن هذا في حين يبحث بعض الاشياء عن السادس منذ فترة ولكن الآن أنا لا يمكن العثور عليه.

هل كانت مفيدة؟

المحلول

% يتم استبدال اسم الملف الحالي ، وبالتالي يمكنك استخدامها:

:w !sudo tee %

(vim سيتم الكشف عن هذا الملف تم تغيير تسأل ما إذا كنت تريد أن يكون حصريا.أقول نعم عن طريق اختيار [L] بدلا من موافق.)

كاختصار ، يمكنك تحديد القيادة الخاصة بك.وضع التالي في .vimrc:

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

مع ما ورد أعلاه يمكنك كتابة :W<Enter> لحفظ الملف.منذ أن كتبت هذا وجدت أجمل طريقة (في رأيي) أن تفعل هذا:

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

بهذه الطريقة يمكنك كتابة :w!! وأنه سيتم توسيع الكامل سطر الأوامر, وترك المؤشر في نهاية, لذا يمكنك استبدال % مع اسم ملف خاص بك إذا أردت.

نصائح أخرى

بشكل عام, لا يمكنك تغيير فعالة معرف المستخدم السادس العملية ، ولكن يمكنك أن تفعل هذا:

:w !sudo tee myfile

المشتركة المحاذير

الأسلوب الأكثر شيوعا من الحصول على جميع أنحاء القراءة فقط من الملف المشكلة هو فتح الأنابيب إلى الملف الحالي فائقة المستخدم باستخدام تطبيق 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 ينبغي أن يكون واضحا ، حيث أن هذا هو السبب في أنك هنا.تشغيل الأمر فائقة المستخدم.هناك الكثير من المعلومات حول الصافي عن كيف يعمل هذا.

tee الأنابيب stdin إلى ملف معين. :write سوف أكتب stdin, ثم فائقة المستخدم tee سوف تتلقى محتويات الملف و كتابة الملف.لن يؤدي هذا إلى إنشاء ملف جديد فقط الكتابة فوق محتويات--حتى ملف وسائط سمات سيتم الحفاظ عليها.

shellescape() يهرب أحرف خاصة في مسار الملف بما يتناسب قذيفة الحالية.واحدة فقط مع المعلمة ، عادة فقط قم بتضمين المسار في الاقتباس عند الضرورة.بما أننا إرسال كامل قذيفة سطر الأوامر سوف ترغب في تمرير قيمة غير صفرية كما الوسيطة الثانية إلى تمكين مائل-الهروب من الأحرف الخاصة الأخرى التي قد خلاف ذلك رحلة قذيفة.

@% يقرأ محتويات % السجل الذي يحتوي على الحالية العازلة اسم الملف.ليس بالضرورة مسار مطلق, لذا تأكد من أنك لم تغير الدليل الحالي.في بعض الحلول ، سترى التجارية في رمز حذفها.اعتمادا على الموقع ، % هو التعبير صحيح, و له نفس تأثير القراءة % السجل.تداخل داخل تعبير آخر الاختصار هو عموما غير مسموح ، ولكن:كما في هذه الحالة.

>NUL و >/dev/null إعادة توجيه stdout إلى منصة فارغة الجهاز.على الرغم من أننا قد أسكت الأمر, نحن لا نريد كل من النفقات العامة المرتبطة الأنابيب stdin العودة إلى همة--أفضل لتفريغ ذلك في أقرب وقت ممكن. NUL هو null الجهاز على دوس MS-DOS و ويندوز وليس ملف صالح.كما من ويندوز 8 إعادة توجيه إلى NUL لا نتيجة في ملف اسمه NUL كتب.حاول إنشاء ملف على سطح المكتب اسمه NUL, مع أو بدون امتداد الملف:سوف تكون قادرة على القيام بذلك.(وهناك عدة أسماء الأجهزة في ويندوز التي قد يكون من المفيد التعرف على.)

~/.vimrc

التي تعتمد على منصة

بالطبع, كنت لا تزال لا تريد أن حفظ تلك واكتب بها كل الوقت.انها أسهل بكثير خريطة الأمر المناسب أن أبسط الأمر المستخدم.للقيام بذلك على POSIX ، يمكنك إضافة السطر التالي إلى ملف ~/.vimrc ملف إنشاء هذا إذا لم تكن موجودة بالفعل:

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

هذا سوف يسمح لك اكتب :W (تحسس حالة الأحرف) الأوامر لكتابة الملف الحالي مع سوبر-أذونات المستخدم--أسهل بكثير.

منصة مستقلة

يمكنني استخدام منصة مستقلة ~/.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

إذا كنت تستخدم همة, هناك سيناريو المتاحة اسمه سودو.همة.إذا وجدت أن كنت قد فتحت ملف تحتاج الجذر الوصول إلى قراءة نوع

:e sudo:%
همة يستبدل % مع اسم الملف الحالي ، sudo: يرشد سودو.همة النصي على القراءة والكتابة.

ريان نصيحة جيدة عموما ، ومع ذلك ، إذا كان بعد الخطوة 3 لا تتحرك المؤقتة الملف ؛ سيكون من الخطأ الملكية والأذونات.بدلا من ذلك ، sudoedit الملف الصحيح و قراءة محتويات (باستخدام :r أو ما شابه) من الملف المؤقت.

إذا بعد الخطوة 2 استخدام :w! لإجبار الملف إلى أن تكون مكتوبة.

عندما تذهب إلى إدراج الوضعية على ملف تحتاج سودو الوصول إلى تحرير ، يمكنك الحصول على وضع رسالة تقول

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

إذا كنت أفتقد ذلك ، عموما أنا لا

:w ~/edited_blah.tmp
:q

..ثم..

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

..أو..

sudo mv edited_blah.tmp /etc/blah

ربما هناك أقل دوار طريقة للقيام بذلك ، لكنه يعمل.

سريعة ويبدو أن جوجل تعطي هذه النصيحة:

  1. لا تحاول تحرير إذا كان للقراءة فقط.
  2. كنت قد تكون قادرة على تغيير الأذونات على الملف.(سواء كان أو لم يكن تمكنك من حفظ ما يصل إلى التجريب.)
  3. إذا كنت لا تزال تحرير على أية حال, حفظ إلى ملف مؤقت ومن ثم نقله.

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

هنا هو آخر واحد التي ظهرت منذ كان هذا السؤال أجاب البرنامج المساعد يسمى SudoEdit التي توفر SudoRead و SudoWrite الوظائف التي سوف افتراضيا محاولة استخدام سودو الأولى و سو إذا فشل ذلك: http://www.vim.org/scripts/script.php?script_id=2709

لدي هذا في ~/.bashrc:

alias svim='sudo vim'

الآن كلما كنت بحاجة إلى تحرير ملف التكوين أنا فقط فتحه مع svim.

سريع هاك يمكن أن تفكر في القيام chmod على ملف التعديل ، مع حفظ همة ، ثم chmod العودة إلى ما كان الملف أصلا.

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)

بالطبع أنا لا أوصي هذا النهج في نظام حيث كنت قلقا بشأن الأمن ، كما لبضع ثوان يمكن لأي شخص قراءة/تغيير الملف دون علمك.

استخدام gksudo بدلا من سودو بالنسبة GVim أي

cmap w!! w !gksudo tee >/dev/null %
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top