เป็นไปได้ไหมที่จะบันทึกเป็น sudo จาก nano หลังจากที่คุณลืมที่จะเรียกใช้เป็น sudo


49

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


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

1
@ xenaterracide - ฉันคิดว่าคำถามที่เป็นกลุ่มเป็นกรณีพิเศษของอันนี้เนื่องจากที่จริงมีทางออกและดูเหมือนว่ากรณีทั่วไปไม่มี ฉันก็ไม่แน่ใจเหมือนกันว่าขึ้นอยู่กับคุณ :)
Kit Sunde

คุณสามารถสร้างแผนที่ใน. vimrc ของคุณเพื่อเรียกฟังก์ชั่น sudo tee ได้อย่างง่ายดาย: <pre> <code> "อนุญาตให้เขียนไฟล์ที่มีสิทธิ์พิเศษ cmap w !! w! sudo tee%> / dev / null </pre> < / code>
jasonwryan

@xenoterracide: คำตอบของคาเลบเกี่ยวกับนาโนมีประโยชน์ดังนั้นฉันคิดว่าเราควรเก็บไว้เฉพาะนาโนนี้เท่านั้น
มิเคล

1
@mikel ฉันตัดสินใจว่าการรวมไม่ถูกต้อง nanoไม่ใช่vim... และไม่มีnanoวิธีแก้ปัญหาใดที่คล้ายคลึงกับvimของที่นำเสนอด้วยตนเอง
xenoterracide

คำตอบ:


37

ไม่คุณไม่สามารถให้สิทธิ์การใช้งานโปรแกรมที่ไม่มีเมื่อเริ่มต้นซึ่งจะเป็นช่องโหว่ด้านความปลอดภัยที่เรียกว่า 'การเพิ่มระดับสิทธิ์'

สองสิ่งที่คุณสามารถทำได้:

  1. บันทึกเป็นไฟล์ชั่วคราวใน / tmp หรือที่ใดก็ได้ปิดตัวแก้ไขจากนั้นดัมพ์เนื้อหาของไฟล์ temp ลงในไฟล์ที่คุณกำลังแก้ไข sudo cp $TMPFILE $FILE. โปรดทราบว่าจะไม่แนะนำให้ใช้mvสำหรับสิ่งนี้เนื่องจากการเปลี่ยนแปลงในความเป็นเจ้าของไฟล์และการอนุญาตที่มีแนวโน้มที่จะทำให้เกิดคุณเพียงแค่ต้องการแทนที่เนื้อหาของไฟล์ไม่ใช่ตัวยึดตำแหน่งไฟล์เอง
  2. ให้พื้นหลังตัวแก้ไขด้วยCtrl+ zเปลี่ยนความเป็นเจ้าของไฟล์หรือการอนุญาตเพื่อให้คุณสามารถเขียนได้จากนั้นใช้fgเพื่อกลับไปที่ตัวแก้ไขและบันทึก อย่าลืมแก้ไขสิทธิ์!

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


ยอดเยี่ยม ขอบคุณ Caleb ฉันเพิ่งพบปัญหานี้ประมาณ 30 นาทีที่ผ่านมา :)
boehj

2
@Caleb คุณสามารถใช้คำสั่ง tee จากภายใน vim เพื่อทำสิ่งที่คุณอธิบาย::w !sudo tee

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

4
คำถามนี้น่าจะเกี่ยวกับนาโน หากเราเริ่มรวมคำตอบเกี่ยวกับ Vim ไว้ที่นี่ประเด็นของคำถามนี้คืออะไร เราได้กลายเป็นรากจากภายในเป็นกลุ่มสำหรับกลุ่ม
มิเคล

2
บันทึกเป็นไฟล์ชั่วคราวใน / tmp - จะบันทึกไฟล์ชั่วคราวในขณะที่อยู่ใน nano ได้อย่างไร?
Anand Rockzz

7

ฉันลองnanoแล้วและสิ่งที่ฉันพบว่าน่าประหลาดใจที่สุดคือมันไม่ได้เตือนคุณว่าไฟล์จะเป็นแบบอ่านอย่างเดียวเมื่อคุณเริ่มพยายามแก้ไขไฟล์ ( อัปเดต: นาโน 2.2 เตือนไม่ได้; 2.0 ไม่ได้ )

นี่คือสคริปต์ (พื้นฐาน) ที่ทำเช่นนั้น

มันตรวจสอบว่าคุณสามารถแก้ไขไฟล์ได้หรือไม่หากไม่สามารถทำได้มันจะรัน "nano" เป็นรูทแทน

/ usr / local / bin / แก้ไข (หรือ~ / bin / แก้ไข )

sudo=                       # empty is false, non-empty is true
editor=nano                 # XXX check $EDITOR and $VISUAL

if test -e "$1" && test ! -w "$1"; then
    if test -t 0 && test -t 2; then
        printf "%s is not writable.  Edit with sudo? [y/n] " "$1" 1>&2
        read -n 1
        case $REPLY in
        y|Y)
            sudo=true
            ;;
        n|N)
            sudo=
            ;;
        *)
            printf "\nExpected y or n.  Exiting.\n" 1>&2
            exit 1
            ;;
        esac
    else
        printf "%s is not writable.  Fix the permissions or run \"view\" instead." "$1" 1>&2
        exit 1
    fi
fi

${sudo:+sudo} "$editor" "$1"

และคำสั่งที่ฉันเรียกviewเพื่อให้คุณสามารถหลีกเลี่ยงพรอมต์ถ้าคุณรู้ว่าคุณจะไม่ทำการเปลี่ยนแปลงใด ๆ

/ usr / local / bin / view (หรือ~ / bin / view )

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

มีโปรแกรมที่เรียกviewว่าเป็นส่วนหนึ่งของ Vi / Vim ดังนั้นอย่าลังเลที่จะแนะนำชื่อที่ดีกว่า
(แต่ฉันคิดว่าการใช้งานโปรแกรมนี้อย่างสมบูรณ์จะทำให้ Vi viewซ้ำซ้อน)


เวอร์ชันเต็ม


1
มันเตือนคุณจริงๆ คำถามจะเป็นเวอร์ชันที่คุณใช้อยู่ นอกจากนี้สำหรับระบบที่ใช้เดเบียนแล้วระบบทางเลือกนั้นเหมาะสำหรับสิ่งที่คุณแนะนำ
0xC0000022L

2
สำหรับการอ้างอิงของคุณ: [ Read ... lines (Warning: No write permission) ]เป็นสิ่งที่ปรากฏอยู่เหนือสองบรรทัดของความช่วยเหลือสำหรับทางลัด (ด้านล่างของหน้าจอ) รุ่นนาโนคือ 2.2.4
0xC0000022L

อามันไม่ได้เตือนใน nano 2.0 ซึ่งเป็นสิ่งที่ฉันกำลังทดสอบด้วย
Mikel

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