การใช้เสียงเรียกเข้าเพื่อบังคับให้แก้ไขไฟล์เมื่อคุณเปิดโดยไม่มีสิทธิ์


51

ฉันใช้เสียงเรียกเข้าเพื่อแก้ไขไฟล์ บางครั้งฉันลืมที่จะมีสิทธิ์ที่เหมาะสม ฉันเรียกใช้เป็นกลุ่มและไฟล์เป็นไฟล์แบบอ่านอย่างเดียว ฉันสามารถเปลี่ยนแปลงได้ แต่ฉันไม่สามารถเขียนการเปลี่ยนแปลงได้ ฉันจะเปิดไฟล์และทำการเปลี่ยนแปลงทุกครั้งในบางครั้งฉันรู้ว่าฉันไม่ได้เรียกใช้ใน sudo กรีดร้องกับตัวเองแล้วบังคับให้ออกและเปิดขึ้นอีกครั้งในฐานะผู้ใช้รูท

มีวิธีแก้ปัญหาสำหรับสิ่งนี้หรือไม่? ฉันสามารถบังคับให้เปลี่ยนแปลงไฟล์ได้แม้จะเป็นสถานะอ่านอย่างเดียวของไฟล์หรือไม่ อย่างน้อยฉันสามารถบันทึกการเปลี่ยนแปลงเรียกใช้ diff และรวมไฟล์เข้าด้วยกันได้หรือไม่


3
ดูเหมือนคำถามนี้จะได้รับคำตอบแล้วที่นี่: stackoverflow.com/questions/1005/…
Autumnal

ขอโทษด้วย. ฉันไม่พบคำตอบนั้น ขอขอบคุณ.
Andor kesselman

3
ใช้ [เขียนเป็นกลุ่มด้วยเคล็ดลับ sudo] [1]: w! sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

คำตอบ:


81

ดูเหมือนว่าจะมีวิธีการที่แตกต่างกันไปขึ้นอยู่กับปัญหาปัจจุบันของคุณ:

  1. อ่านอย่างเดียวโดย vi หากไฟล์ของคุณมี:set readonlyคุณสามารถ
    • ใช้:w!เพื่อบังคับให้เขียนหรือ
    • ออก:set noreadonlyแล้วใช้งานได้ตามปกติ:w
  2. รับอนุญาตปัญหา ( sudo ): คุณไม่สามารถเขียน แต่คุณมีสิทธิ์ sudo
    • :w !sudo tee %ฉบับที่: นี่จะเขียนบัฟเฟอร์ไปยังteeคำสั่งที่รับข้อมูลไพพ์และสามารถเขียนไปยังไฟล์ได้ และเมื่อทีรันด้วยพลัง sudo ทีก็สามารถแก้ไขไฟล์ได้
  3. รับอนุญาตปัญหา ( ไม่มี sudo ): คุณไม่ได้มีสิทธิในการเขียนไฟล์และคุณไม่สามารถเข้าถึงผู้ดูแลระบบ
    • ใช้:w! ~/tempfile.extเพื่อเขียนการเปลี่ยนแปลงของคุณไปยังไฟล์ชั่วคราวจากนั้นใช้มาตรการเพื่อย้ายไฟล์ temp ไปยังไดเรกทอรี (ส่งไฟล์ temp ไปยังเจ้าของไดเรกทอรี / ผู้ดูแลระบบ)

คุณสามารถอ่านเพิ่มเติมได้ที่นี่:

  1. จาก StackOverflow
  2. จาก Geekyboy
  3. จาก Data Agaric

ทางลัด

เนื่องจากมักเป็นปัญหาที่ # 2 ( ปัญหาการอนุญาตด้วยsudo ) คุณสามารถไปที่/etc/vim/vimrc(หรือ~/.vimrc) ทางลัดต่อไปนี้ของคุณ:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

จากนั้นคุณสามารถพิมพ์:w!!เพื่อบันทึกด้วยพลังsudo ฉันจะไม่อธิบายที่นี่ แต่การอ้างอิงข้างต้นครอบคลุมทางลัดมากมาย


1
และด้วยสิ่งที่ไม่ระบุชื่อของคุณอย่างฉันเพิ่งได้รับตราหมอผี! ขอบคุณ! ตอนนี้ฉันรู้สึกอยากปกป้องมอร์ดอร์แล้ว ;)
Dr Beco

5

ฉันสามารถคิดวิธีการนี้ได้สองวิธี

วิธีแรกถือว่าคุณเป็นเจ้าของไฟล์ แต่ไฟล์นั้นพร้อมใช้งาน

เพียงใช้เครื่องหมายอัศเจรีย์ของ vi ต่อท้ายคำสั่ง write (: w!) เพื่อบังคับให้เขียนทับไฟล์ READONLY ของคุณเอง แน่นอนว่าคุณได้รับอนุญาตให้เขียนและดำเนินการในโฟลเดอร์ปัจจุบัน

:w!

จะทำให้ vi เขียนทับไฟล์ READONLY ดั้งเดิม

วิธีที่สองถือว่าคนอื่นเป็นเจ้าของไฟล์และคุณต้องการบันทึกการเปลี่ยนแปลงของคุณในไฟล์นั้น

วิธีหนึ่งในการทำสิ่งนี้ให้สำเร็จคือบันทึกการเปลี่ยนแปลงที่ทำไว้กับไฟล์ต้นฉบับเป็นสคริปต์ ed จากภายใน vi สคริปต์ ed นี้อาจนำไปใช้กับไฟล์ต้นฉบับ (หรือไฟล์ที่คล้ายกันอื่น ๆ ) ในเวลาต่อมานอกเหนือจาก vi ด้วย ed line editor

วิธีบันทึกเซสชันแก้ไขปัจจุบันเป็นสคริปต์ ed คือการส่งชื่อไฟล์ต้นฉบับและบัฟเฟอร์ vi ที่แก้ไขแล้วเป็นอินพุตมาตรฐานไปยังยูทิลิตี diff ด้วยสวิตช์บรรทัดคำสั่ง --ed เช่นแสดงความแตกต่างเป็นสคริปต์ ed

ดังนั้นสมมติว่าบัฟเฟอร์ vi ที่แก้ไขแล้วดำเนินการดังต่อไปนี้

:.,$!diff --ed [original_file] -

สิ่งนี้จะแทนที่ทุกบรรทัดในบัฟเฟอร์ปัจจุบัน (., $!) ด้วยสคริปต์ที่สร้างโดย diff (diff - ed [original_file] -) ที่จำเป็นในการแปลงไฟล์ต้นฉบับเป็นเนื้อหาของบัฟเฟอร์ปัจจุบัน จากนั้นเราต้องการบันทึกสคริปต์ ed นี้ไว้ในที่ปลอดภัยและใช้สคริปต์กับไฟล์ต้นฉบับที่เราสามารถเขียนได้ ดังนั้นให้บันทึกสคริปต์ไปยังตำแหน่งที่สามารถเขียนได้เช่นโฟลเดอร์ล็อกอินของคุณ:

:w ~/my_ed_script

ตอนนี้ออกจาก vi และใช้สคริปต์ ed นี้เพื่อรับไฟล์ที่แก้ไขซึ่งไม่สามารถบันทึกได้ตั้งแต่แรก นี่คือวิธีการทำให้สำเร็จจากพรอมต์บรรทัดคำสั่ง bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

สิ่งที่ลำดับคำสั่งนี้ทำในคำพูดคือการทำให้สคริปต์ที่เราสร้างขึ้นมีความต่างและสะท้อนคำสั่ง ed write, 'w' ไปยังอินพุตมาตรฐานของ ed จากนั้น Ed จะใช้สคริปต์นี้กับสำเนาที่สามารถเขียนได้ของไฟล์ต้นฉบับและเขียนการเปลี่ยนแปลงบัฟเฟอร์ที่แก้ไขแล้วเหล่านั้นกลับไปที่ไฟล์

ดังนั้นนี่คือวิธีบันทึกงานที่ทำใน vi ไปยังไฟล์ซึ่ง แต่เดิมเคยเป็นของคนอื่นที่ใช้ vi, diff และ ed


1

เพียงแค่ต้องการครอบคลุมกรณีที่เมื่อไม่มีสิทธิ์การเขียนไฟล์

:!chmod +w %
:w!

ในระหว่างที่เป็นกลุ่มจะบ่นเกี่ยวกับการเปลี่ยนแปลงในไฟล์ (เนื่องจากการเปลี่ยนแปลงสถานะ) เห็นได้ชัดว่าปลอดภัยที่จะเพิกเฉย


0

เป็นไปได้อีกสำหรับกรณีที่คุณไม่มีสิทธิ์ sudo คือการใช้:w /somewhere/where/i/have/permissions/foo.txtและจากนั้นจัดการกับปัญหาสิทธิ์ต่อมาตามไรอันฟ็อกซ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.