เปิดไฟล์ที่มี su / sudo ใน Emacs


174

สมมติว่าผมต้องการที่จะเปิดไฟล์ในเซสชั่นที่มีอยู่ Emacs ใช้suหรือsudoโดยไม่ต้องวางลงไปที่เปลือกและการทำหรือsudoedit sudo emacsวิธีหนึ่งในการทำเช่นนี้คือ

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

แต่ต้องมีราคาแพงround-trip ผ่าน SSH มีวิธีที่ตรงกว่านี้ไหม?

[แก้ไข] @JBB ถูกต้อง ฉันต้องการที่จะสามารถเรียกsu/ sudoเพื่อบันทึกเช่นเดียวกับเปิด มันจะตกลง (แต่ไม่เหมาะ) ให้อนุญาตอีกครั้งเมื่อบันทึก สิ่งที่ฉันกำลังมองหาเป็นรูปแบบของfind-fileและsave-bufferที่สามารถ "ประปา" ผ่าน/susudo


5
ฉันแค่อยากจะทราบว่าคนจรจัดมาติดตั้งโดยค่าเริ่มต้นตั้งแต่ emacs22 ดังนั้นคนส่วนใหญ่สามารถทำ Cc Cf / sudo :: / path-to / file ได้โดยไม่มีปัญหา
เขาวงกต

1
ขอบคุณสำหรับการsudoeditกล่าวถึง มีประโยชน์มาก.
tshepang

6
สำเนา Cf ควรเป็น Cx Cf หรือไม่
James.Xu

คำตอบ:


64

สิ่งที่ดีเกี่ยวกับคนจรจัดก็คือคุณจ่ายสำหรับการไปกลับที่ SSH เท่านั้นเมื่อคุณเปิดไฟล์แรก จากนั้น Sudo จะเก็บข้อมูลประจำตัวของคุณและ Emacs จะบันทึกหมายเลขอ้างอิงเพื่อให้ไฟล์ที่เปิดใน sudo ใช้เวลาน้อยลง

ฉันไม่ได้พบเวลาพิเศษเพื่อประหยัดภาระเช่นกัน มันเร็วพอ IMO


3
รอสักครู่ ... แคชหมดอายุบ่อยแค่ไหน
Chris Conway

20
จรจัดไม่ได้รอบการเดินทางผ่านทาง SSH จะใช้subshell
เท็ดดี้

ประเด็นของฉันคือคุณจ่ายค่าใช้จ่ายสำหรับไฟล์ที่เปิดครั้งแรกไม่ใช่สำหรับไฟล์อื่น ๆ
EfForEffort


18

ถ้าคุณใช้helm, รองรับการเปิดไฟล์เป็นรากด้วยhelm-find-filesC-c r


วิธีนี้ใช้ได้ผล แต่ดูเหมือนว่าจะยังคงอยู่ในเซสชันทุก ๆ ไฟล์จะถูกเปิดและบันทึกเป็นรูท ไม่มีอะไรในเอกสารM-x helm-find-files C-c ?ที่บอกวิธีการกลับสู่โหมดปกติของการเปิดในฐานะผู้ใช้ การทำC-c rอีกครั้งไม่ได้หยุด
เลียม

@ เลียมฉันยังคงสามารถเปิดไฟล์ในฐานะผู้ใช้ปกติเมื่อฉันใช้คุณสมบัตินั้น
Qudit

มันแปลกมาก - ไฟล์บางไฟล์ก็ใช้ได้ดีบางไฟล์ก็พยายามเปิดเป็นรูท ฉันฆ่ารหัสผ่านรูทด้วยคำสั่ง emacs sudo -kจากนั้นจะแจ้งให้ใส่รหัสผ่าน ฉันรีสตาร์ท Emacs และนั่นก็ไม่ได้กำจัดปัญหา ฉันขุดไปรอบ ๆ.emacs.dและพบการอ้างอิงถึงคนจรจัดดังนั้นฉันจึงลบสิ่งเหล่านั้น ตอนนี้มันดูดีขึ้น แต่ไม่แน่ใจว่าฉันว่างหรือเปล่า
เลียม

15

ไม่ใช่คำตอบสำหรับคำถามเดิม แต่นี่เป็นฟังก์ชั่นผู้ช่วยที่ทำให้เส้นทางเดินเล่น / เดินเล่นง่ายขึ้นเล็กน้อย:

(กำหนดค่า sudo-find-file (ชื่อไฟล์)
  "ชอบค้นหาไฟล์ แต่เปิดไฟล์ในฐานะรูท"
  (โต้ตอบ "ไฟล์ค้นหา FSudo:")
  (ให้ ((ชื่อไฟล์จรจัด (concat "/ sudo ::" (นามสกุลไฟล์ชื่อไฟล์))))
    (find-file tramp-file-name)))

ฉันคิดว่าEmacs Starter Kitมีบางสิ่งที่คล้ายกันesk-sudo-editค่ะ
mrmagooey


4

ตัวอย่างของคุณไม่ได้เริ่มต้นเลยอย่างน้อยก็ไม่ใช่รุ่น TRAMP ของฉัน ("2.1.13-pre") ทั้ง find-file และ save-buffer ใช้งานได้ดี


คุณอาจเก็บข้อมูลประจำตัวของคุณไว้ เมื่อ TRAMP เริ่มขึ้นเป็นครั้งแรกมันจะใช้เวลาประมาณ 10-15 วินาทีของเนื้อหา SSH (ฉันได้ 2.1.13- ก่อนหน้าด้วย)
Chris Conway

คุณแน่ใจไหม? ฉันหมายความว่ามันควรจะเริ่ม subshell แต่ไม่ใช่เซสชั่น SSH เพื่อ localhost ใช้เวลาประมาณ 5 วินาทีในการเรียกใช้การดักข้อมูลอัตโนมัติทั้งหมดในครั้งแรก
jfm3

ฉันไม่แน่ใจ ฉันควรจะบอกว่ามี 10-15 วินาทีของสิ่งที่ TRAMP (อาจจะเป็น SSH) ฉันไม่ได้กังวลเกี่ยวกับ SSH ต่อ se แต่เกี่ยวกับความล่าช้าในการเริ่มต้น สิ่งที่การเริ่มต้นนี้ยังคงมีอยู่นานเท่าใด
Chris Conway

ควรใช้เวลามากกว่าวินาทีในครั้งแรกที่คุณทำ นั่นคือแม้ว่าคุณจะบันทึก / sudo :: file ให้ลบบัฟเฟอร์และเปิด / sudo :: file2, file2 ควรเปิดอย่างรวดเร็ว และมันทำให้เปลือกเปิดและเก็บผลลัพธ์ของการดมกลิ่นทั้งหมด
jfm3

แต่ข้อมูลประจำตัวถูกแคช: (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

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

ปัญหาคือคุณคงไม่เพียงแค่ต้องการเปิดไฟล์ คุณต้องการที่จะสามารถบันทึกได้ในภายหลัง ดังนั้นคุณต้องรูทส่วนตัวของคุณเพื่อคงอยู่ไม่เพียงมีอยู่สำหรับการเปิดไฟล์

ดูเหมือนว่าคุณต้องการให้ Emac กลายเป็นผู้จัดการหน้าต่างของคุณ มันป่องมากพอถ้าไม่มี :)


11
ฮ่า ๆ ๆ ที่คุณพูดบวม Emacs เคยดูใหญ่ ตอนนี้เมื่อเทียบกับรอยเท้าของรันไทม์ของ Java, Ruby และอาจเป็นกองสิ่งอื่น ๆ มันดูผอมมาก โดยไม่คำนึงถึงฉันคิดว่าคำถามของคริสได้รับการใช้ Emacs อย่างถูกกฎหมายอย่างสมบูรณ์
jfm3

1
คุณเอาชนะฉันไป ฉันใช้โมเดลนี้อย่างสม่ำเสมอ เมื่อเข้าสู่ระบบฉันจะเริ่มต้นเซสชัน Emacs หนึ่งรายการสำหรับสิ่งทั่วไปหนึ่งรายการสำหรับการเข้าถึง SU (ในฐานะรูท) และหนึ่งรายการขึ้นไปสำหรับการพัฒนาซอฟต์แวร์ (โดยทั่วไปต่อโครงการ แต่ไม่เสมอไป) เคยทำมาหลายปีแล้ว เพิ่งได้ผล
pajato0

คุณสามารถอธิบายวิธีการทำสิ่งนี้ได้อย่างไร: "เปิดเชลล์ใน Emacs และ exec sudo emacs"
johnbakers

1
@ OpenLearner อย่างจริงจังคุณไม่ต้องการทำเช่นนั้นจริงๆ
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.