Trở thành root từ bên trong Vim


72

Đôi khi tôi bắt đầu chỉnh sửa các tệp cấu hình /etcbằng cách sử dụng Vim, nhưng quên sử dụng sudođể khởi động Vim. Kết quả không thể tránh khỏi là sau khi hoàn thành các chỉnh sửa của mình, tôi gặp phải thông báo đáng sợ rằng tôi không được phép lưu tệp.

Chủ yếu là các chỉnh sửa đủ nhỏ để tôi chỉ cần thoát Vim và thực hiện lại toàn bộ với tư cách là root. Tất nhiên tôi có thể lưu vào một vị trí mà tôi có thể viết và sau đó sao chép dưới dạng root, nhưng điều đó cũng hơi khó chịu.

Nhưng tôi chắc chắn có một cách dễ dàng hơn để trở thành root hoặc sử dụng sudotừ bên trong Vim, mà không phải loại bỏ các thay đổi. Nếu phương pháp không dựa vào sudoviệc được thiết lập cho người dùng thì sẽ tốt hơn nữa.


1
Tôi đã có thói quen sử dụng sudoeditthay vì vimcho tất cả các chỉnh sửa quản trị viên. Đó là một cách để không bao giờ gặp phải vấn đề này nữa :). +1 cho câu trả lời của Gilles .
jw013

Những câu hỏi và trả lời từ SO này có ích vì vậy liên kết với chúng ở đây: Nhận quyền root trên một tệp bên trong vi? & Làm thế nào để vim thuyền viết với thủ thuật sudo phạm? .
slm

Câu trả lời:


46

sudo không thể thay đổi người dùng hiệu quả của một quy trình hiện có, nó luôn tạo ra một quy trình mới có các đặc quyền nâng cao và vỏ ban đầu không bị ảnh hưởng. Đây là một nền tảng của thiết kế UNIX. Tôi thường chỉ lưu tệp vào / tmp như một cách giải quyết. Nếu bạn thực sự muốn lưu nó trực tiếp, bạn có thể thử sử dụng một tính năng của Vim nơi nó có thể dẫn một tệp đến một quy trình khác. Hãy thử lưu với lệnh này:

:w !sudo dd of=%

Đã thử nghiệm và hoạt động. Vim sau đó sẽ yêu cầu bạn tải lại tệp, nhưng không cần thiết: bạn chỉ cần nhấn ođể tránh tải lại và mất lịch sử hoàn tác. Bạn thậm chí có thể lưu nó vào một lệnh / chức năng Vim hoặc thậm chí liên kết nó với một khóa để dễ truy cập, nhưng tôi sẽ để nó như một bài tập cho người đọc.


2
Đó là một giải pháp thú vị, nhưng bạn có thể thay thế đường dẫn bằng %, trong vim sẽ là đường dẫn của tệp bạn đang chỉnh sửa.
Reid

Bạn nên bọc %dấu ngoặc kép trong trường hợp tên tệp chứa khoảng trắng.
trực giác

Ngoài ra: điều này sẽ không thiết lập lại 'modified'cài đặt; bạn có thể làm điều đó bằng tay với set nomodified.
trực giác

2
Trên thực tế, nếu bạn thực sự muốn cẩn thận, bạn nên làm exec 'w !sudo dd of=' . shellescape(expand('%'))trong trường hợp tên tệp chứa dấu ngoặc kép, dấu gạch chéo ngược, ký hiệu đô la, v.v.
trực quan

Làm thế nào là khác nhau với Commandlinefu -command bởi plaes?


13

Gọi sudoeditđể chỉnh sửa tập tin như root.

Hãy nghĩ về sự bất tiện khi gọi vimtrực tiếp như một lời cảnh báo rằng bạn quá bình thường khi làm điều gì đó có khả năng nguy hiểm.



3

Điều này cũng hoạt động tốt:

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

Điều này được lấy cảm hứng từ bình luận của @Nathan Long trong câu trả lời này .

THÔNG BÁO :

"phải được sử dụng thay 'vì bởi vì chúng tôi muốn %được mở rộng trước khi chuyển sang shell.

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.