web-dev-qa-db-ja.com

Emacs内でsu / Sudoを使用してファイルを開く

シェルにドロップダウンしてsuまたはSudo emacsを実行せずに、Sudoまたはsudoeditを使用して、既存のEmacsセッションでファイルを開きたいとします。これを行う1つの方法は

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

しかし、これには高価な SSH経由の往復 が必要です。もっと直接的な方法はありますか?

[編集] @JBBは正しいです。 su/Sudoを呼び出して、開くだけでなく保存することもできます。保存時に再認証しても問題ありません(理想的ではありません)。私が探しているのは、find-filesave-bufferのバリエーションで、su/Sudoを介して「パイピング」できます。

170
Chris Conway

Trampの良い点は、最初のファイルを開いたときにSSHへの往復の料金のみを支払うことです。その後、Sudoは資格情報をキャッシュし、Emacsはハンドルを保存します。これにより、後続のSudoで開かれたファイルにかかる時間が大幅に短縮されます。

負担を軽減するのにかかる余分な時間もわかりません。 IMO、十分に高速です。

62
EfForEffort

TrampはnotSSH経由で往復Sudoを行い、subshel​​lを使用します。マニュアルを参照してください: https://www.gnu.org/software/tramp/#Inline-methods

したがって、TRAMPを使用することをお勧めします。

62
Teddy

helmを使用する場合、helm-find-filesC-c rでルートとしてファイルを開くことをサポートします。

17
Qudit

元の質問への答えではありませんが、tramp/Sudoルーティングを少し簡単にするヘルパー関数を次に示します。

[.____。 .____。](let((tramp-file-name(concat "/ Sudo ::"(expand-file-name file-name))))
(find-file tramp-file-name)) )
15
Burton Samograd

少なくとも保存のために、 Sudo-save package はまさにその種の問題のために書かれました。

5
huitseeker

あなたの例は、少なくとも私のバージョンのTRAMP( "2.1.13-pre")では、sshをまったく起動しません。 find-fileとsave-bufferの両方がうまく機能します。

4
jfm3

アドバイスコマンドを使用することをお勧めします。この関数を〜/ .emacsに入れます

(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))))
2
anquegi

(ローカルでのみ動作します。tramp経由で正しく動作するように更新する必要があります)

バートンの答えを少し拡張しました。

(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))
      ))
    )
)
1
alex_1948511

あーおそらく、Emacsでシェルを開き、Sudo emacsを実行できます。

問題は、おそらくファイルを開くだけではないということです。後で保存できるようにします。したがって、ファイルを開くためだけに存在するのではなく、ルート権限を保持する必要があります。

Emacsをウィンドウマネージャーにしたいようです。それなしでは十分に肥大化しています。 :)

0
JBB