Sử dụng vim để buộc chỉnh sửa tệp khi bạn mở mà không có quyền


51

Tôi sử dụng vim để chỉnh sửa một tập tin. Đôi khi, tôi quên có quyền thích hợp. Tôi chạy vim và tập tin dưới dạng tập tin chỉ đọc. Tôi có thể thay đổi, nhưng tôi thực sự không thể viết những thay đổi. Thỉnh thoảng, tôi lại mở một tập tin và thay đổi nó, nhận ra rằng tôi đã không chạy nó trong sudo, hét lên với chính mình, và sau đó buộc thoát và mở lại nó với tư cách là người dùng root.

Có một cách giải quyết cho điều này? Tôi có thể buộc các thay đổi đối với tệp mặc dù trạng thái chỉ đọc của tệp không? Tôi ít nhất có thể lưu các thay đổi, chạy khác biệt và hợp nhất các tệp lại với nhau không?


3
Câu hỏi này dường như đã được trả lời ở đây: stackoverflow.com/questions/1005/ trên
Mùa thu

Lời xin lỗi của tôi. Tôi đã không tìm thấy phản ứng đó. Cảm ơn bạn.
andor kesselman

3
Sử dụng [Vim write with sudo trick] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/
Lỗi

Câu trả lời:


81

Dường như có một số cách tiếp cận khác nhau, tùy thuộc vào vấn đề hiện tại của bạn:

  1. Chỉ đọc bởi vi. Nếu tập tin của bạn có :set readonlybạn có thể
    • Sử dụng :w!để buộc viết, hoặc
    • Phát hành :set noreadonlyvà sau đó chỉ cần sử dụng bình thường:w
  2. Một vấn đề về quyền ( sudo ): bạn không thể viết nhưng bạn có quyền sudo.
    • Vấn đề : :w !sudo tee %. Điều này sẽ ghi bộ đệm vào tee, một lệnh nhận thông tin đường ống và có thể ghi vào tệp. Và vì tee được chạy với quyền hạn sudo, tee có thể sửa đổi tệp.
  3. Một vấn đề về quyền ( không có sudo ): bạn không có quyền viết tệp và bạn không có quyền truy cập quản trị viên.
    • Sử dụng :w! ~/tempfile.extđể ghi các thay đổi của bạn vào một tệp tạm thời và sau đó thực hiện các biện pháp để di chuyển tệp tạm thời vào thư mục (gửi tệp tạm thời đến chủ sở hữu / quản trị thư mục).

Bạn có thể đọc thêm về nó ở đây:

  1. Từ StackOverflow
  2. Từ Geekyboy
  3. Từ dữ liệu Agaric

Đường tắt

Vì đây thường là vấn đề trường hợp # 2 ( vấn đề về quyền , với sudo ), bạn có thể /etc/vim/vimrc(hoặc ~/.vimrc) phím tắt sau:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Sau đó, bạn có thể chỉ cần gõ :w!!để lưu với quyền hạn sudo . Tôi sẽ không giải thích nó ở đây nhưng các tài liệu tham khảo ở trên bao gồm nhiều phím tắt.


1
Và với ẩn danh của bạn như tôi vừa kiếm được huy hiệu necromancer! Cảm ơn! Tôi cảm thấy như bảo vệ Mordor bây giờ. ;)
Bác sĩ Beco

5

Tôi có thể nghĩ ra hai cách để làm điều này.

Cách đầu tiên giả sử bạn sở hữu tệp, nhưng tệp là S READN SÀNG.

Chỉ cần sử dụng hậu tố dấu chấm than của vi vào lệnh ghi (: w!) Để buộc ghi đè lên tệp READONLY của riêng bạn. Điều này tất nhiên giả định rằng bạn có quyền viết và thực thi trong thư mục hiện tại.

:w!

sẽ khiến vi ghi đè lên tệp S READN SÀNG ban đầu.

Cách thứ hai giả định người khác sở hữu tệp và bạn muốn lưu các thay đổi của mình vào tệp đó.

Một cách để thực hiện điều này là lưu các thay đổi được thực hiện cho tệp gốc dưới dạng tập lệnh ed từ bên trong vi. Tập lệnh ed này có thể được áp dụng cho tệp gốc (hoặc các tệp tương tự khác) sau đó ngoài vi với trình chỉnh sửa dòng ed.

Một cách để lưu phiên chỉnh sửa hiện tại dưới dạng tập lệnh ed là chuyển tên tệp gốc và bộ đệm vi đã chỉnh sửa làm đầu vào tiêu chuẩn cho tiện ích diff bằng công tắc dòng lệnh --ed, tức là hiển thị sự khác biệt dưới dạng tập lệnh ed.

Vì vậy, giả sử một bộ đệm vi đã chỉnh sửa, sau đó thực hiện như sau

:.,$!diff --ed [original_file] -

Điều này thay thế tất cả các dòng trong bộ đệm hiện tại (., $!) Bằng tập lệnh ed được tạo khác biệt (diff --ed [original_file] -) cần thiết để chuyển đổi tệp gốc thành nội dung của bộ đệm hiện tại. Sau đó, chúng tôi muốn lưu tập lệnh ed này vào một nơi an toàn và áp dụng tập lệnh vào phiên bản của tập tin gốc mà chúng tôi có thể ghi vào. Vì vậy, hãy lưu tập lệnh vào vị trí có thể ghi, ví dụ: thư mục đăng nhập của bạn:

:w ~/my_ed_script

Bây giờ hãy thoát vi và sử dụng tập lệnh ed này để lấy tệp đã chỉnh sửa không thể lưu ở vị trí đầu tiên. Đây là cách thực hiện điều đó từ dấu nhắc dòng lệnh bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

Chuỗi lệnh này thực hiện trong các từ là để catenate script mà chúng ta đã tạo với diff và lặp lại lệnh ed write, 'w', với đầu vào tiêu chuẩn của ed. Sau đó, Ed áp dụng tập lệnh này vào bản sao có thể ghi của tệp gốc và ghi những thay đổi bộ đệm đã sửa đổi đó trở lại tệp.

Vì vậy, đó là một cách để lưu công việc được thực hiện trong vi vào một tệp mà ban đầu được sở hữu bởi người khác sử dụng vi, diff và ed.


1

Chỉ muốn bao gồm trường hợp khi không có quyền ghi tập tin.

:!chmod +w %
:w!

Ở giữa vim sẽ phàn nàn về những thay đổi trong tệp (vì cờ thay đổi) - rõ ràng là an toàn để bỏ qua chúng


0

Một khả năng khác, đối với trường hợp bạn không có đặc quyền sudo, là sử dụng :w /somewhere/where/i/have/permissions/foo.txtvà sau đó xử lý vấn đề quyền sau này, theo Ryan Fox .

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.