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


174

私が使用して既存のEmacsセッションでファイルを開きたいとしsuたりsudoシェルに落下し、実行せずに、sudoeditまたはsudo emacs。これを行う1つの方法は

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

ただし、これにはSSHを介した高価な往復が必要です。より直接的な方法はありますか?

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


5
emacs22以降、trampはデフォルトでインストールされるので、ほとんどの人は問題なくCc Cf / sudo :: / path-to / fileを実行できます。
ラビリンス

1
sudoedit言及いただきありがとうございます。非常に便利。
tshepang 2013

6
Cc CfはCx Cfである必要がありますか?
James.Xu 2013

回答:


64

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

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


3
少々お待ちください...キャッシュはどのくらいの頻度で期限切れになりますか?
Chris Conway、

20
TrampはSSH経由の往復ではなくサブシェルを使用します。
テディ

私の要点は、最初に開いたファイルの費用を支払うことであり、他のファイルの費用は払わないということでした。
EfForEffort 2013年


18

あなたが使用している場合はhelmhelm-find-files支持体が持つルートとしてファイルを開きますC-c r


これは機能しますが、セッションでは永続的であるように見え、その後、すべてのファイルが開かれ、ルートとして保存されます。M-x helm-find-files C-c ?ユーザーとして開く通常のモードに戻る方法を説明するドキュメントには何もありません。こうC-c rもう一度と、それを停止しません。
リアム

@Liamその機能を使用しても、通常のユーザーとしてファイルを開くことができます。
Qudit

それは非常に奇妙です-一部のファイルは問題ありません、いくつかはそれがルートとして開こうとします。rootパスワードをemacsコマンドで強制終了sudo -kすると、パスワードの入力を求められます。Emacsを再起動しましたが、問題は解決しませんでした。調べて.emacs.dみたところ、trampへの参照がいくつか見つかったので、それらを削除しました。今ではそれは良いようですが、私がそれから自由であるかどうかはわかりません。
リアム

15

元の質問に対する実際の回答ではありませんが、ここにtramp / sudoルートを少し簡単にするためのヘルパー関数があります:

(defun sudo-find-file(ファイル名)
  「ファイルの検索と同様ですが、ファイルをルートとして開きます。」
  (インタラクティブな「FSudo Find File:」)
  (let((tramp-file-name(concat "/ sudo ::"(expand-file-name file-name)))))
    (検索ファイルtramp-file-name)))

Emacsスターターキットもに似ていると思いますesk-sudo-edit
mrmagooey 2011


4

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


資格情報がキャッシュされている可能性があります。trampが最初に起動すると、10〜15秒のSSH処理が行われます。(私は2.1.13-preも持っています。)
Chris Conway

本気ですか?つまり、それはサブシェルを開始する必要がありますが、localhostへのSSHセッションではありません。すべてのtramp自動スニファを初めて実行するのに約5秒かかります。
jfm3 2008

まあ、いいえ、わかりません。10-15秒のtramp(多分SSH)のものがあると言うべきです。私はSSH自体については心配していませんが、起動の遅れについて心配しています。このスタートアップのものはどのくらい持続しますか?
Chris Conway、

初めて実行するときは、1秒以上かかるはずです。つまり、/ sudo :: fileを保存してバッファを削除し、/ sudo :: file2を開いた場合でも、file2はすぐに開くはずです。シェルを開いたままにし、すべてのスニッフィングの結果をキャッシュします。
jfm3 2008

しかし、資格情報はキャッシュされますか?(1)そのEmacsプロセスの場合、または(2)すべてのEmacsプロセスの場合?また、(a)Emacsが閉じたとき、(b)一定の期間(時間?日?週?)の後、または(c)システムの再起動後、期限が切れますか?
Chris Conway、

3

アドバイスコマンドを使用することをお勧めします。この関数を〜/ .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))))

明らかであることを指摘するために、これはあなたがido-find-fileファイルを見つけるために使用していることを必要とします。
tripleee 2017年

1

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

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

(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

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

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

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


11
ははははははは Emacsはかつて巨大に見えました。さて、Java、Ruby、そしておそらく他のものの山の実行時のフットプリントと比較すると、それはかなり無駄のないように見えます。いずれにせよ、クリスの質問はEmacsの完全に合法的な使用に関係していると思います。
jfm3 2008

1
あなたは私をそれに負けました。私はこのモデルを一貫して使用しています。ログイン時に、Emacsセッションを一般的なもの、SUアクセス(rootとして)、およびソフトウェア開発(通常はプロジェクトごとですが常にではない)のために1つ以上開始します。何年もやってきた。うまくいきます。
pajato0

これを行う方法を明確にできますか:「Emacsでシェルを開いてsudo emacsを実行する」
johnbakers

1
@OpenLearner真剣に、あなたは本当にそれをしたくないのです。
Tripleee、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.