vim chỉnh sửa lại bằng root


28

Tôi thường mở một tệp trong vim, thực hiện một số thay đổi và khi đến lúc lưu tệp ở chế độ chỉ đọc .. (thuộc sở hữu của người dùng khác). Tôi đang tìm kiếm các mẹo về cách tôi có thể mở lại tệp dưới dạng root và giữ các thay đổi của mình mà không lưu tệp đó vào tệp tạm thời để sao chép hoặc chỉnh sửa lại dưới dạng root.

Câu trả lời:


42

Từ câu trả lời stackoverflow này , bằng skinp

:w !sudo tee %

Tôi thường quên sudo trước khi chỉnh sửa một tập tin mà tôi không có quyền ghi. Khi tôi đến để lưu tệp đó và gặp lỗi cấp phép, tôi chỉ phát lệnh vim đó để lưu tệp mà không cần lưu tệp vào tệp tạm thời và sau đó sao chép lại.


Đó là gần như vậy .. Nhưng thật tuyệt khi vim khởi động lại và chạy như root .. Đây là mục yêu thích của tôi cho đến nay :)
rkthkr

@rkthkr, nếu "vim khởi động lại và chạy bằng root", bạn sẽ không thể lưu bất kỳ chỉnh sửa nào bạn đã thực hiện và mất lịch sử hoàn tác. Nhưng nếu đó là những gì bạn muốn ... [Chạy ra khỏi nhân vật.] Xem "câu trả lời" tôi sắp viết.
Bruno Bronosky

2
@dbr, tôi nghĩ điều đáng nói là sau khi bạn ghi đè tệp (với tee là sudo), bạn sẽ được nhắc với [O] k hoặc [L] oad. Tùy chọn sau sẽ xóa lịch sử hoàn tác của bạn, đặt lại "cờ đã sửa đổi" cho phép bạn thoát mà không bị cảnh báo để lưu các thay đổi. Tùy chọn trước đây, mà tôi thích, sẽ lưu lại lịch sử hoàn tác của bạn, nhưng sẽ khiến bạn bị cảnh báo khi bạn cố gắng thoát. Bạn phải sử dụng: q! để bỏ thuốc trong trường hợp này. Tôi làm điều này để tôi có thể xác nhận (ví dụ :! Sudo /etc/init.d/httpd configtest) và rollback / reedit nếu tôi cần.
Bruno Bronosky

15

Xin đừng bỏ phiếu cho tôi vì điều này. Tôi không khuyên bạn nên thực hiện câu trả lời này, nhưng đó là câu trả lời mà rkthkr đang yêu cầu.

rkthkr nói:
Nhưng thật tuyệt khi vim khởi động lại và chạy bằng root

Cách thực hiện là với :!sudo vim %
Như tôi đã đề cập với ipozgaj,% dưới dạng đối số (thậm chí là đối số phụ) được thay thế bằng đường dẫn đến bộ đệm hiện tại. (Bạn có thể được nhắc nhập mật khẩu.) Bạn kết thúc với một quy trình vim mới, thuộc sở hữu của root, đó là một quy trình con của quy trình vim gốc. Nghe có vẻ ngớ ngẩn phải không? Đây là những gì nó trông giống như trong ps:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

Nếu bạn có quyền ghi vào thư mục chứa tệp và bạn đã chỉnh sửa tệp đó, bạn có thể được cảnh báo rằng tệp hoán đổi thoát. Chọn [R] ecover, sẽ phản ánh hầu hết * các thay đổi được thực hiện bởi quy trình vim gốc. (* Tôi nghĩ rằng có lẽ bản cập nhật hoán đổi được hẹn giờ hoặc có ngưỡng đồng bằng. Tôi đã đặt quá nhiều thời gian vào việc này đã và không quan tâm để nghiên cứu nó.) Khi bạn đi và bỏ vim, đừng lo lắng khi bạn đang vẫn còn trong vim ... bạn đã mở quy trình vim thứ 2. Nhớ lại?

Bây giờ, với tất cả những gì đã nói ... tôi gần như sẽ không bao giờ làm điều này. Có lẽ, nếu tôi không có đủ hoặc uống quá nhiều cà phê, và tôi nhận ra rằng tôi sẽ cần phải chỉnh sửa thêm một số tệp dưới dạng root ... Tôi có thể thử điều này. Trong 14 năm quản trị hệ thống, tôi không bao giờ có. Nhưng, cho đến khi bạn bày tỏ sự bất bình với giải pháp ưa thích của tôi (chính xác như dbr đưa ra) tôi chưa bao giờ nghĩ về điều này.


Cảm ơn Richard! Rất nhiều thông tin, tôi sẽ cung cấp cho bạn +1 cho nó :)
rkthkr

Đây là một câu trả lời chất lượng rất cao: tại sao bỏ phiếu xuống? +1 từ tôi cũng vậy.
Mei

1
Cảm ơn @Richard Bronosky, trong gvim của tôi không thể nhập mật khẩu sudo :w !sudo tee %vì vậy tôi nghĩ đây là một câu trả lời tốt.
Eric Fortis

1

Tôi thường lưu nó vào một tệp tạm thời trong $ HOME / tmp / apache.conf (ví dụ) sau đó

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

đây là một số công việc bổ sung để hợp nhất các thay đổi nhưng nó đã được đền đáp. Tôi thấy đó là một cách hay giữa sự thuận tiện và các phép đo chống lại những thay đổi không mong muốn

Trước đó tôi đã nghĩ đến ACL hoặc chỉ định các nhóm tương ứng cho các tệp nhưng nó không hoạt động thường xuyên. Tôi đã quên thay đổi quyền sở hữu hoặc thay đổi các tệp mà tôi không có ý định làm như vậy.

Điều đó chỉ áp dụng cho các tệp không được quản lý cho đến bây giờ. Giải pháp tổng thể mà chúng tôi sử dụng là con rối với git repo nơi mọi người chỉnh sửa tệp cục bộ và kiểm tra các thay đổi trên các máy chủ phù hợp, nếu cấu hình hoạt động như mong muốn, các thay đổi sẽ được đẩy trở lại kho lưu trữ trung tâm nơi công cụ cấu hình của chúng tôi thay đổi các giao diện thông thường.


0

Những gì tôi thường làm - không nhất thiết là nhanh nhất, nhưng chắc chắn an toàn - là làm một cái gì đó như thế này (sử dụng nsswitch.conf làm ví dụ):

:w! ~/%

Thoát khỏi vim, sau đó làm:

sudo vim nsswitch.conf
1GdG
:r ~/%

Điều này sẽ xóa tất cả các dòng và đọc trong phiên bản thay đổi và cập nhật của bạn để được chỉnh sửa ở vị trí của nó. Sử dụng thư mục chính của bạn có nghĩa là bạn không phải suy nghĩ về việc bạn có quyền truy cập hay không - và nó riêng tư hơn / tmp. Lưu ý rằng đây là toàn bộ thay thế tệp: nếu bạn không muốn thêm tất cả các thay đổi, bạn sẽ phải chọn và chọn.

Mặc dù đau đầu liên quan đến bất kỳ câu trả lời nào trong số này, không có lý do gì để mất những thay đổi của bạn.

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.