กลายเป็นรากจากภายในเป็นกลุ่ม


72

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

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

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


1
ฉันมีนิสัยชอบใช้งานsudoeditแทนที่จะvimแก้ไขทั้งหมดสำหรับผู้ดูแลระบบ เป็นวิธีหนึ่งที่จะไม่พบปัญหานี้อีกต่อไป :) +1 สำหรับคำตอบที่กิลส์
jw013

คำถาม & คำตอบที่มาจาก SO เหล่านี้มีประโยชน์ดังนั้นการลิงก์ไปยังพวกเขาที่นี่: การขออนุญาตรูทบนไฟล์ภายใน vi? & เสียงเรียกเข้าแบบ“ เขียนด้วย sudo” เป็นอย่างไร .
slm

คำตอบ:


46

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

:w !sudo dd of=%

ผ่านการทดสอบและใช้งานได้ กลุ่มจะขอให้คุณโหลดไฟล์ใหม่ แต่ไม่จำเป็นคุณสามารถกดoเพื่อหลีกเลี่ยงการโหลดซ้ำและสูญเสียประวัติการเลิกทำของคุณ คุณสามารถบันทึกสิ่งนี้ไว้ในคำสั่ง / ฟังก์ชั่น Vim หรือแม้แต่ผูกมันไว้กับกุญแจเพื่อให้เข้าถึงได้ง่าย แต่ฉันจะปล่อยให้มันเป็นแบบฝึกหัดให้กับผู้อ่าน


2
นั่นเป็นทางออกที่น่าสนใจ แต่คุณสามารถแทนที่เส้นทางด้วย%ซึ่งในกลุ่มจะเป็นเส้นทางของไฟล์ที่คุณกำลังแก้ไข
Reid

คุณควรใส่%เครื่องหมายคำพูดในกรณีที่ชื่อไฟล์มีช่องว่าง
intuited

นอกจากนี้: สิ่งนี้จะไม่รีเซ็ตการ'modified'ตั้งค่า set nomodifiedคุณสามารถทำได้ด้วยตนเอง
intuited

2
ที่จริงแล้วถ้าคุณต้องการที่จะระมัดระวังจริงๆคุณควรทำexec 'w !sudo dd of=' . shellescape(expand('%'))ในกรณีที่ชื่อไฟล์มีเครื่องหมายคำพูด, เครื่องหมายแบ็กสแลช, เครื่องหมายดอลลาร์ ฯลฯ
intuited

มันแตกต่างอย่างไรกับ Commandlinefu -command โดย plaes?


13

โทรsudoeditเพื่อแก้ไขไฟล์ในฐานะรูท

ลองนึกถึงความไม่สะดวกเมื่อโทรvimโดยตรงเพื่อเป็นการเตือนว่าคุณไม่ได้ทำอะไรที่อาจเป็นอันตราย


8

คุณสามารถใส่สิ่งนี้ในของคุณ .vimrc

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

คุณทริกเกอร์ด้วยการทำ:w!!- มันจะส่งไฟล์sudo teeไปยังชื่อไฟล์ปัจจุบัน ( %)

จากhttps://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks


และถ้าคุณมีการติดตั้งเพิ่มเติมแล้วให้ใช้!sudo sponge %แทน
towo

3

สิ่งนี้ยังใช้งานได้ดี:

:w !sudo sh -c "cat > %"

นี่คือแรงบันดาลใจจากความคิดเห็นของ @Nathan Long ในคำตอบนี้

ประกาศ :

"ต้องใช้แทน'เพราะเราต้องการ%ขยายก่อนส่งไปยัง shell

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