Có thể lưu dưới dạng sudo từ nano sau khi bạn quên chạy như sudo không?


49

Rất nhiều lần tôi chỉnh sửa một tệp bằng nano, cố gắng lưu và gặp lỗi cấp phép vì tôi quên chạy nó dưới dạng sudo. Có một số cách nhanh chóng để tôi có thể trở thành sudo mà không cần phải mở lại và chỉnh sửa lại tập tin?


hợp nhất với câu hỏi này đã được đề xuất. Về cơ bản cùng một vấn đề, nhưng vim. Tôi đang xem xét việc hợp nhất ... mặc dù tôi cũng đang xem xét thực tế rằng các hướng dẫn cụ thể của vim sẽ không hoạt động nano.
xenoterracide

1
@xenaterracide - Tôi nghĩ rằng câu hỏi vim là một trường hợp đặc biệt của câu hỏi này, vì câu hỏi đó thực sự có một giải pháp và có vẻ như trường hợp chung không có. Tôi cũng không chắc chắn, tùy thuộc vào bạn. :)
Kit Sunde

Bạn có thể tạo ánh xạ trong .vimrc của mình để dễ dàng gọi hàm sudo tee: <pre> <code> "Cho phép ghi vào các tệp với quyền riêng tư cmap w !! w! Sudy tee%> / dev / null </ pre> < / code>
jasonwryan

@xenoterracide: Câu trả lời của Caleb về Nano rất hữu ích, vì vậy tôi nghĩ chúng ta chỉ nên giữ câu này về Nano.
Mikel

1
@mikel Tôi quyết định hợp nhất là không hợp lệ. nanokhông phải vim... và không có nanogiải pháp nào tương tự như vimhọ đã trình bày.
xenoterracide

Câu trả lời:


37

Không, bạn không thể cung cấp một quyền chương trình đang chạy mà nó không có khi nó khởi động, đó sẽ là lỗ hổng bảo mật được gọi là 'leo thang đặc quyền'.

Hai điều bạn có thể làm:

  1. Lưu vào một tệp tạm thời trong / tmp hoặc bất cứ nơi nào, đóng trình chỉnh sửa, sau đó chuyển nội dung của tệp tạm thời vào tệp bạn đang chỉnh sửa. sudo cp $TMPFILE $FILE. Lưu ý rằng nó không được khuyến nghị sử dụng mvcho việc này vì sự thay đổi quyền sở hữu tệp và quyền mà nó có thể gây ra, bạn chỉ muốn thay thế nội dung tệp chứ không phải chính trình giữ chỗ tệp.
  2. Bối cảnh trình chỉnh sửa với Ctrl+ z, thay đổi quyền sở hữu tệp hoặc quyền để bạn có thể ghi vào đó, sau đó sử dụng fgđể quay lại trình chỉnh sửa và lưu. Đừng quên sửa các quyền!

¹ Một số biên tập viên thực sự có thể làm điều này bằng cách tung ra một quá trình mới với các điều khoản khác nhau và đi qua các dữ liệu ra để quá trình đó cho tiết kiệm. Xem ví dụ câu hỏi liên quan này để biết các giải pháp khác trong các trình soạn thảo nâng cao cho phép ghi bộ đệm tệp vào ống quy trình. Nano không có khả năng khởi chạy một quy trình mới hoặc truyền dữ liệu cho các quy trình khác, do đó, nó bị loại khỏi bên này.


Xuất sắc. Cảm ơn Caleb. Tôi vừa gặp vấn đề này khoảng 30 phút trước. :)
boehj

2
@Caleb Bạn có thể sử dụng lệnh tee từ bên trong vim để làm những gì bạn mô tả::w !sudo tee

@hellojesus Thủ thuật rực rỡ. Nếu bạn quan tâm để viết nó lên như một câu trả lời tôi có thể loại bỏ nó khỏi tôi. Tôi cho rằng những người khác ngoài người dùng nano gặp phải tình huống này và có thể thấy mình ở đây.
Caleb

4
Câu hỏi này được cho là về nano. Nếu chúng ta bắt đầu bao gồm các câu trả lời về Vim ở đây, điểm của câu hỏi này là gì? Chúng tôi đã có quyền root từ bên trong Vim cho Vim.
Mikel

2
Lưu vào một tệp tạm thời trong / tmp - Làm cách nào để lưu vào tệp tạm thời trong khi ở trong nano?
Anand Rockzz

7

Tôi mới thử nano, và điều tôi thấy ngạc nhiên nhất là nó thậm chí không cảnh báo bạn rằng tệp chỉ đọc khi bạn bắt đầu cố gắng chỉnh sửa tệp. ( CẬP NHẬT: Rõ ràng nano 2.2 không cảnh báo; 2.0 không. )

Đây là một kịch bản (cơ bản) làm điều đó.

Nó kiểm tra xem bạn có thể chỉnh sửa tệp hay không và nếu không thể, nó sẽ chạy "nano" dưới dạng root.

/ usr / local / bin / chỉnh sửa (hoặc ~ / bin / chỉnh sửa )

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"

Và một lệnh tôi đã gọi viewđể bạn có thể tránh lời nhắc nếu bạn biết bạn sẽ không thực hiện bất kỳ thay đổi nào.

/ usr / local / bin / view (hoặc ~ / bin / view )

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Đã có một chương trình được gọi là viewmột phần của Vi / Vim, vì vậy hãy đề xuất một tên tốt hơn.
(Nhưng tôi nghĩ rằng việc thực hiện đầy đủ chương trình này sẽ khiến Vi trở viewnên dư thừa.)


Phiên bản đầy đủ


1
Nó thực sự cảnh báo bạn. Câu hỏi sau đó sẽ là phiên bản bạn đang sử dụng. Ngoài ra, trên các hệ thống dựa trên Debian, hệ thống thay thế phù hợp hơn với những gì bạn đang đề xuất.
0xC0000022L

2
Để bạn tham khảo: [ Read ... lines (Warning: No write permission) ]là những gì xuất hiện ngay phía trên hai dòng trợ giúp cho các phím tắt (phía dưới màn hình). Phiên bản Nano là 2.2.4.
0xC0000022L

Ah, nó không cảnh báo trong nano 2.0, đó là những gì tôi đã thử nghiệm.
Mikel

thật tuyệt, chúng tôi đã sắp xếp nó ra :)
0xC0000022L
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.