الحصول على أذونات الجذر على ملف داخل السادس ؟
سؤال
في كثير من الأحيان أثناء تحرير ملفات التكوين ، سأفتح واحد مع السادس ثم عندما أذهب إلى حفظه أدرك أنني لم اكتب
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
ريان نصيحة جيدة عموما ، ومع ذلك ، إذا كان بعد الخطوة 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
ربما هناك أقل دوار طريقة للقيام بذلك ، لكنه يعمل.
سريعة ويبدو أن جوجل تعطي هذه النصيحة:
- لا تحاول تحرير إذا كان للقراءة فقط.
- كنت قد تكون قادرة على تغيير الأذونات على الملف.(سواء كان أو لم يكن تمكنك من حفظ ما يصل إلى التجريب.)
- إذا كنت لا تزال تحرير على أية حال, حفظ إلى ملف مؤقت ومن ثم نقله.
هنا هو آخر واحد التي ظهرت منذ كان هذا السؤال أجاب البرنامج المساعد يسمى 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 %