Mở tệp có su / sudo bên trong Emacs


174

Giả sử tôi muốn mở một tệp trong phiên Emacs hiện có bằng cách sử dụng suhoặc sudo, không thả xuống trình bao và thực hiện sudoedithoặc sudo emacs. Một cách để làm điều này là

C-x C-f /sudo::/path/to/file

nhưng điều này đòi hỏi một chuyến đi khứ hồi đắt tiền thông qua SSH . Có cách nào trực tiếp hơn không?

[EDIT] @JBB là đúng. Tôi muốn có thể gọi su/ sudođể lưu cũng như mở. Sẽ là ổn (nhưng không lý tưởng) để ủy quyền lại khi lưu. Những gì tôi đang tìm kiếm là các biến thể của find-filesave-buffercó thể được "chuyển" qua su/ sudo.


5
Tôi chỉ muốn lưu ý rằng tramp được cài đặt theo mặc định kể từ emacs22, vì vậy hầu hết mọi người chỉ có thể thực hiện Cc Cf / sudo :: / path-to / file mà không gặp vấn đề gì.
mê cung

1
Cảm ơn đã sudoeditđề cập. Rất hữu ích.
tshepang

6
Cc Cf nên là Cx Cf?
James.Xu

Câu trả lời:


64

Điều thú vị về Tramp là bạn chỉ trả tiền cho chuyến đi khứ hồi đó với SSH khi bạn mở tệp đầu tiên. Sudo sau đó lưu trữ thông tin đăng nhập của bạn và Emacs lưu một xử lý, để các tệp sudo mở sau đó mất ít thời gian hơn.

Tôi cũng không tìm thấy thêm thời gian để tiết kiệm gánh nặng. Nó đủ nhanh, IMO.


3
Đợi một chút ... Bao lâu thì bộ nhớ cache hết hạn?
Chris Conway

20
Tramp làm không khứ hồi thông qua SSH, nó sử dụng một subshell .
Teddy

Quan điểm của tôi thực sự là bạn phải trả chi phí cho tập tin được mở đầu tiên chứ không phải cho bất kỳ ai khác.
EfForEffort


18

Nếu bạn sử dụng helm, helm-find-fileshỗ trợ mở tệp với quyền root C-c r.


Điều này hoạt động, nhưng dường như vẫn tồn tại trong một phiên, mọi tệp sau đó được mở và lưu dưới dạng root. Không có gì trong tài liệu M-x helm-find-files C-c ?cho biết làm thế nào để trở về chế độ mở thông thường như người dùng. Làm C-c rlại không dừng lại.
Liam

@Liam Tôi vẫn có thể mở tệp như một người dùng bình thường khi tôi sử dụng tính năng đó.
Qudit

Nó rất kỳ quặc - một số tệp vẫn ổn, một số tệp cố mở bằng root. Tôi đã giết mật khẩu gốc bằng các lệnh emacs sudo -kvà sau đó nó sẽ nhắc mật khẩu. Tôi đã khởi động lại Emacs và điều đó không loại bỏ được vấn đề. Tôi đào xung quanh .emacs.dvà tìm thấy một số tài liệu tham khảo về tramp vì vậy tôi đã xóa chúng. Bây giờ có vẻ tốt hơn nhưng không chắc chắn nếu tôi miễn phí.
Liam

15

Không thực sự là một câu trả lời cho câu hỏi ban đầu, nhưng đây là một chức năng trợ giúp để thực hiện lộ trình tramp / sudo dễ dàng hơn một chút:

(defun sudo-find-file (tên tệp)
  "Giống như tìm tệp, nhưng mở tệp dưới dạng root."
  (tương tác "Tệp tìm kiếm FSudo:")
  (let ((tramp-file-name (concat "/ sudo ::" (tên tệp mở rộng tên tệp)))))
    (find-file tramp-file-name)))

Tôi nghĩ rằng Emacs Starter Kit có một cái gì đó tương tự esk-sudo-edit.
mrmagooey


4

Ví dụ của bạn hoàn toàn không bắt đầu ssh, ít nhất là không phải với phiên bản TRAMP của tôi ("2.1.13-pre"). Cả find-file và save-buffer đều hoạt động tốt.


Bạn có thể có thông tin đăng nhập của bạn được lưu trữ. Khi TRAMP lần đầu tiên khởi động, nó sẽ trải qua 10-15 giây của công cụ SSH. (Tôi cũng có 2.1.13-pre.)
Chris Conway

Bạn có chắc không? Ý tôi là, nó nên bắt đầu một subshell, nhưng không phải là một phiên SSH tới localhost. Mất khoảng 5 giây để chạy tất cả TRAMP tự động đánh hơi lần đầu tiên.
jfm3

Chà, không, tôi không chắc. Tôi nên nói rằng có 10-15 giây TRAMP (có thể là SSH). Tôi không quan tâm đến SSH mỗi lần, nhưng về độ trễ khi khởi động. Công cụ khởi động này tồn tại bao lâu?
Chris Conway

Nó chỉ nên mất hơn một giây trong lần đầu tiên bạn làm điều đó. Đó là, ngay cả khi bạn lưu / sudo :: file, xóa bộ đệm và mở / sudo :: file2, file2 sẽ mở nhanh. và nó giữ cho vỏ mở và lưu trữ kết quả của tất cả việc đánh hơi của nó.
jfm3

Nhưng các thông tin đăng nhập được lưu trong bộ nhớ cache: (1) cho quy trình Emacs đó hay (2) cho tất cả các quy trình Emacs? Và chúng có hết hạn không: (a) khi Emacs đóng cửa, (b) sau một khoảng thời gian cố định (giờ? Ngày? Tuần?), Hoặc (c) sau khi khởi động lại hệ thống?
Chris Conway

3

Tôi khuyên bạn nên sử dụng các lệnh tư vấn. Đặt chức năng này trong ~ / .emacs của bạn

(defadvice ido-find-file (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

Chỉ cần chỉ ra điều hiển nhiên, điều này đòi hỏi bạn phải sử dụng ido-find-fileđể tìm tệp.
tripleee

1

(chỉ hoạt động cục bộ. Cần được cập nhật để hoạt động chính xác thông qua tramp)

Một chút mở rộng câu trả lời của Burton:

(defun sudo-find-file (file-name)
"Like find file, but opens the file as root."
(interactive "FSudo Find File: ")
(let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
(find-file tramp-file-name)))


(add-hook 'dired-mode-hook
    (lambda ()
      ;; open current file as sudo 
      (local-set-key (kbd "C-x <M-S-return>") (lambda()
        (interactive)
        (message "!!! SUDO opening %s" (dired-file-name-at-point))
        (sudo-find-file (dired-file-name-at-point))
      ))
    )
)

0

Ừ Có lẽ bạn có thể mở một shell trong Emacs và thực hiện sudo emacs.

Vấn đề là có lẽ bạn không chỉ muốn mở tệp. Bạn muốn có thể lưu nó sau. Vì vậy, bạn cần có quyền riêng tư gốc của bạn để tồn tại, không chỉ tồn tại để mở tệp.

Âm thanh như bạn muốn Emacs trở thành người quản lý cửa sổ của bạn. Nó đủ lớn mà không có điều đó. :)


11
Ha ha bạn nói phình to. Emacs đã từng có vẻ rất lớn. Bây giờ, so với các dấu chân thời gian chạy của Java, Ruby và có lẽ là một đống các thứ khác, nó trông khá gầy. Bất kể, tôi nghĩ rằng câu hỏi của Chris có được sử dụng Emacs hoàn toàn hợp pháp.
jfm3

1
Bạn đánh bại tôi vào nó. Tôi sử dụng mô hình này một cách nhất quán. Khi đăng nhập, tôi bắt đầu một phiên Emacs cho các công cụ chung, một cho truy cập SU (với quyền root) và một hoặc nhiều để phát triển phần mềm (thường là theo từng dự án nhưng không phải lúc nào cũng vậy). Được làm việc đó trong nhiều năm. Chỉ cần làm việc.
pyjato0

bạn có thể làm rõ cách làm điều này không: "mở một cái vỏ trong Emacs và exec sudo emacs"
johnbakers 29/11/13

1
@OpenLearner Nghiêm túc mà nói, bạn không thực sự muốn làm điều đó.
tripleee 22/05/2015
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.