เปิดไฟล์ผ่าน SSH และ Sudo ด้วย Emacs


114

ฉันต้องการเปิดไฟล์ภายใน Emacs ซึ่งตั้งอยู่บนเซิร์ฟเวอร์ระยะไกลโดยมีอำนาจ sudo บนเซิร์ฟเวอร์ ฉันสามารถเปิดไฟล์ในเครื่องด้วย sudo ผ่าน Tramp ดังนี้:

C-x C-f /sudo::/home/user/file

แต่ฉันต้องการใช้ sudo บนเซิร์ฟเวอร์:

C-x C-f /sudo::user@server/home/user/file

แต่สิ่งนี้ทำให้ฉันมีอำนาจ sudo บนเครื่องท้องถิ่นของฉันมันขอรหัสผ่าน sudo ของฉันบนเครื่องท้องถิ่น มีวิธีใช้ sudo บนเซิร์ฟเวอร์หรือไม่?

BTW: Emacs ไม่ได้ติดตั้งบนเซิร์ฟเวอร์


คุณไม่สามารถสั่งเป็น root โดยตรงบนเซิร์ฟเวอร์ได้หรือไม่?
Chmouel Boudjnah

2
ฉันมีผู้ใช้ที่มีสิทธิ์ sudo แต่ไม่มีรหัสผ่านรูท
Fernando Briano

คำตอบ:


186

ในวันที่ Emacs 24.3 แอนะล็อกของmulti:ไวยากรณ์แบบเก่าได้ถูกวางไว้บนtramp-default-proxies-alistแนวทางใหม่ซึ่งหมายความว่าคุณสามารถดำเนินการแบบมัลติฮ็อพได้อีกครั้งโดยไม่ต้องกำหนดค่าล่วงหน้า สำหรับรายละเอียดโปรดดู:

C-hig (tramp)Ad-hoc multi-hops RET

ด้วยไวยากรณ์ใหม่แต่ละ 'ฮอป' |ถูกคั่นด้วย ตัวอย่างในคู่มือคือ:

C-xC-f /ssh:bird@bastion|ssh:you@remotehost:/path RET

ซึ่งเชื่อมต่อก่อนเป็นbird@bastionและจากที่นั่นถึงyou@remotehost:/path

/ su: หรือ / sudo: บนโฮสต์ระยะไกล

คุณยังสามารถใช้ไวยากรณ์นี้เพื่อ sudo / su เพื่อรูท (หรือแน่นอนผู้ใช้รายอื่น) บนโฮสต์ระยะไกล:

C-xC-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

สำคัญ : อย่าลืมระบุชื่อโฮสต์อย่างชัดเจน: sudo:remotehost:แทนที่จะเป็นsudo:: (ดูด้านล่าง)

เนื่องจากยังคงใช้กลไกพร็อกซีที่อยู่ด้านล่างtramp-default-proxies-alistตอนนี้จึงควรรวมค่า("remotehost" "root" "/ssh:you@remotehost:")

แปลว่าพร็อกซี /ssh:you@remotehost:จะถูกใช้เมื่อใดก็ตามที่คุณขอไฟล์เป็นroot@remotehost.

root เป็นผู้ใช้เริ่มต้นสำหรับวิธีการเหล่านี้ แต่คุณสามารถเปลี่ยนเป็นผู้ใช้ที่ไม่ใช่รูทได้ด้วย:

C-xC-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

ระบุชื่อโฮสต์ระยะไกลอย่างชัดเจนเสมอ

คุณอาจคุ้นเคยกับการใช้sudo::หรือsu::และละเว้นชื่อโฮสต์ หากคุณอยู่บน localhost ก็ยังใช้ได้ แต่ถ้าคุณกำลังกระโดดไปยังเซิร์ฟเวอร์ระยะไกลคุณต้องระบุชื่อโฮสต์สำหรับทุกครั้งที่กระโดดแม้ว่าจะเป็นชื่อเดียวกันกับการกระโดดก่อนหน้าก็ตาม ใช้เสมอsudo:hostname:หรือsu:hostname:กับโฮสต์ระยะไกลเสมอ

กับดักที่นี่เป็นที่sudo:: ไม่จริงปรากฏไปทำงาน - แต่เมื่อคุณทำอย่างนั้น HOST สำหรับรายการพร็อกซี่แบบไดนามิกจะเป็นชื่อโฮสต์ที่คุณมีต้นกำเนิดมาจากโฮสต์มากกว่าที่คุณเชื่อมต่อกับ สิ่งนี้ไม่เพียง แต่จะดูสับสน (เนื่องจากโฮสต์ที่ไม่ถูกต้องจะแสดงในเส้นทางของไฟล์) แต่ยังหมายความว่าจะมีการพยายามใช้ในภายหลังsudo::บนโลคัลของคุณในจะถูกพร็อกซีไปยังเซิร์ฟเวอร์ระยะไกลแทน! (และพร็อกซีก็น่าจะถูกปิดกั้นหากคุณทำสิ่งเดียวกันบนเซิร์ฟเวอร์ที่สองทำให้เกิดปัญหาเพิ่มเติม)

ในระยะสั้นอย่าใช้::เมื่อคุณเล่นหลายฮอป!

Emacs 27+

เริ่มจาก Emacs 27.1 (หรือ Tramp 2.4.2 หากใช้แพ็คเกจ GNU ELPA) ::เคสจะทำงานอย่างสังหรณ์ใจซึ่ง/ssh:you@remotehost|sudo::จะกลับมาใช้ใหม่remotehostแทนที่จะเป็นโฮสต์ภายในของคุณเองดังนั้นคุณจะไม่พบรายการพร็อกซีที่ไม่ถูกต้อง

นอกจากนี้/ssh:you@remotehost|sudo:localhost:ยังตรวจพบการชอบและตั้งค่าสถานะว่าเป็นข้อผิดพลาดของผู้ใช้

หากคุณมีแนวโน้มที่จะใช้ Emacs ผสมกันรวมถึงเวอร์ชันก่อนหน้า 27 (หรือคุณกำลังแนะนำคนอื่นที่อาจใช้เวอร์ชันเก่ากว่า) การดำเนินการต่อไปจะ::ปลอดภัยที่สุดหากไม่ปลอดภัยเมื่อทำการกระโดดหลายครั้งเพื่อหลีกเลี่ยง อุบัติเหตุที่อาจเกิดขึ้น (กล่าวคือการระบุโฮสต์ระยะไกลที่ถูกต้องอย่างชัดเจนจะยังคงเป็นแนวทางที่ปลอดภัยที่สุดหากไม่ทราบเวอร์ชัน Tramp)


4
และตอนนี้เพิ่มไปยัง wikemacs เช่นเดียวwikemacs.org/index.php/TRAMP ขอบคุณฟิลมันใช้งานได้ดี
Ehvince

1
ฉันเพิ่งพบคำตอบนี้และใช้งานได้ดี ... ยกเว้นว่าฉันมีชวเลขชื่อโฮสต์ที่กำหนดไว้ในไฟล์. ssh / config เมื่อฉันพิมพ์/sudo:hostname:/etc/hostsฉันจะได้รับสิ่งที่คุณคาดหวัง แต่เมื่อฉันพิมพ์/sudo:abbrev:/etc/hostsฉันได้รับข้อความ "โฮสต์ตัวย่อดูเหมือนโฮสต์ระยะไกล sudo ใช้ได้เฉพาะโฮสต์ในเครื่องเท่านั้น" สามารถแก้ไขได้หรือไม่?
rogerl

2
rogerl: ฉันมี.ssh/configรายการด้วยและฉันไม่มีปัญหาในการใช้/ssh:abbrev|sudo:abbrev:/etc/hostsตัวย่อชื่อโฮสต์ของฉัน ดูเหมือนว่าคุณจะไม่ได้ไปที่โฮสต์ก่อน
Phils

@phils บางทีฉันควรโพสต์คำถามนี้เป็นคำถามใหม่ อย่างไรก็ตาม: ไฟล์ config ของฉันดูเหมือนว่า Host r User rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub และtramp-default-proxies-alistดูเหมือนว่าของฉันจะถูกต้อง แต่พฤติกรรมที่ฉันอธิบายไว้ข้างต้นยังคงมีอยู่ ไฟล์กำหนดค่าของฉันผิดหรือไม่?
rogerl

ก็ยังไม่ชัดเจนกับผมไม่ว่าคุณจะเป็นจริงพยายามที่จะใช้/sudo:abbrev:/etc/hostsในขณะที่คุณใส่ในความคิดเห็นก่อนหน้าของคุณ (ซึ่งเป็นความผิดตามที่กล่าวไว้) /ssh:abbrev|sudo:abbrev:/etc/hostsหรือหากคุณกำลังใช้ที่ถูกต้อง ไฟล์กำหนดค่า ssh ของคุณน่าจะดีเนื่องจากคุณสามารถใช้เป็นอย่างอื่นได้อย่างชัดเจน
Phils

21

อัปเดต : แม้ว่าคำตอบนี้จะแก้ปัญหาเดิมได้ แต่คำตอบนี้เขียนขึ้นสำหรับ emacs 20 หรือ 21 สำหรับ emacs 24 ฉันขอแนะนำให้คุณใช้คำตอบของ philsเนื่องจากมีคำอธิบายเพิ่มเติมและเป็นข้อมูลล่าสุด


ฉันคิดว่าชื่อไฟล์แบบ multi-hopใน tramp คือสิ่งที่คุณกำลังมองหา

การกระโดดครั้งแรกจะเป็น ssh และครั้งที่สองจะเป็น sudo


อัปเดต: emac เวอร์ชันล่าสุดรองรับการกระโดดหลายครั้งโดยใช้พร็อกซี:

(add-to-list 'tramp-default-proxies-alist ("my-sudo-alias" nil "/ssh:user@ssh-host"))

จากนั้นเรียกใช้โดยเปิด:

/sudo:my-sudo-alias:file-on-ssh-host

ดูเหมือนจะเป็นวิธีแก้ปัญหา แต่ฉันได้รับ: "ไม่รองรับ multi method อีกต่อไป" คุณช่วยชี้ให้ฉันดูคู่มือฉบับปรับปรุงได้ไหม
Fernando Briano

Mx info, Cs tramp :) คุณอาจต้องกำหนดโฮสต์ปลอมเป็นเป้าหมายของ sudo ของคุณและเพิ่มลงใน tramp-default-proxy-alist
Dave Bacher

2
ฉันไม่สามารถเรียกใช้มันในการกำหนดค่าของฉัน (ข้อผิดพลาด 255?) แต่บรรทัดต่อไปนี้ใน. emac ใช้งานได้: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
ang mo

คำตอบที่อัปเดตไม่ได้ระบุว่า "ล่าสุด" มี elisp ที่ไม่ถูกต้องและใช้ไม่ได้แม้ว่าคุณจะแก้ไขแล้วก็ตาม ฉันใช้ emac เวอร์ชันเสถียรที่เปิดตัวมานานกว่าหนึ่งปีหลังจากคำตอบที่อัปเดต
Michael Wolf

1
จริงคำตอบเป็น 2014 / 24.3 คือคำตอบต่อไปนี้โดยใช้ "Ad-hoc หลายกระโดด"
TomRoche

7

ฉันมีปัญหากับคำตอบที่เลือก อย่างไรก็ตามมันใช้งานได้เมื่อฉันเพิ่มบรรทัดนี้ใน. emacs:

(add-to-list 'tramp-default-proxies-alist '(".*" "\\`root\\'" "/ssh:%h:"))

จากนั้นดำเนินการต่อไปนี้:

/sudo:ssh-host:file-on-ssh-host

มันสับสนเล็กน้อยเพราะมีอยู่ช่วงหนึ่งฉันได้รับแจ้งให้ใส่รหัสผ่าน "root" แต่การป้อนรหัสผ่านของผู้ใช้ทำให้ฉันสามารถเข้าถึงได้ นอกจากนี้ยังใช้งานได้กับทุกโฮสต์บนเครือข่าย นอกจากนี้ฉันยังสามารถทำได้เพื่อไม่ให้รูท:

/ssh:ssh-host:file-on-ssh-host


3
สิ่งนี้ไม่ได้ผลสำหรับฉัน ดูเหมือนว่าใน Ubuntu อย่างน้อยที่สุดด้วย Emacs เวอร์ชัน 23.2.1 และเวอร์ชัน 2.1.18-23.2 ของคนจรจัดสิ่งนี้จะไม่ทำงาน ใช้งานได้แม้ว่า: info.solomonson.com/content/…
gaizka

(set-default 'tramp-default-proxies-alist (quote ((". *" "\` root \\' "" / ssh:% h: ")))
gaizka

1
ฉันไม่สามารถใช้วิธีแก้ปัญหาข้างต้นอย่างใดอย่างหนึ่งได้ (add-to-list หรือ set-default) สาเหตุแรกทำให้ Emac หายใจไม่ออกเมื่อเริ่มต้นระบบและอย่างที่สองทำให้ฉัน "Host abc.xyz.com' looks like a remote host, sudo" สามารถใช้เฉพาะโฮสต์ภายใน "ทันทีที่ฉันป้อนเครื่องหมายจุดคู่ที่สองใน" /sudo:abc.xyz.com: " ไอเดีย? Emacs 23.1.1 บน Ubuntu 10.04 LTS
SabreWolfy

3

จากหน้าเว็บการกำหนดค่า tramp multi-hops

 (add-to-list 'tramp-default-proxies-alist
                   '(nil "\\`root\\'" "/ssh:%h:"))
      (add-to-list 'tramp-default-proxies-alist
                   '((regexp-quote (system-name)) nil nil))

แล้วใด ๆ

C-x C-f /sudo:remote-host:/file

จะเปิดไฟล์โดยใช้sudoหลังจากเข้าสู่ระบบด้วยชื่อผู้ใช้เดียวกันของผู้ใช้ที่ใช้ emacs แต่อยู่ในเครื่องระยะไกล


-12

คุณต้อง ssh เข้าสู่เซิร์ฟเวอร์ก่อนจากนั้นคุณต้องเรียกใช้ emac ในเครื่อง

หรือคุณสามารถใช้ NFS กับ no_root_squash หรือคุณสามารถลองกับเซิร์ฟเวอร์ / ไคลเอนต์ emacs แม้ว่าฉันไม่รู้ว่าจะเกิดอะไรขึ้น (อย่าใช้ emac ด้วยตัวเอง)


ฉันลองแล้ว แต่ฉันไม่สามารถเข้าถึงไฟล์ในฐานะรูทด้วย sshfs เมื่อติดตั้งเป็นผู้ใช้ทั่วไป ฉันเดาว่ามันเป็นปัญหาในการตั้งค่า
Dan Andreatta

ดังที่ Hassan กล่าวไว้ว่าควรใช้ no_root_squash ด้วยความระมัดระวัง
Dan Andreatta

6
-1 สำหรับการไม่ตอบคำถาม -1 สำหรับการแนะนำ NFS แทน SSH -1 สำหรับการแนะนำ no_root_squash -1 สำหรับแนะนำไคลเอนต์ Emacs ซึ่งโดยปกติจะใช้ซ็อกเก็ตโดเมน Unix สำหรับปัญหาการสื่อสารระยะไกล -1 สำหรับ blethering เกี่ยวกับ Emacs โดยไม่ต้องใช้มัน
สิ้นสุด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.