Mở tệp qua SSH và Sudo với Emacs


114

Tôi muốn mở một tệp bên trong Emacs nằm trên một máy chủ từ xa, với quyền hạn sudo trên máy chủ. Tôi có thể mở các tệp cục bộ bằng sudo qua Tramp như sau:

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

Nhưng tôi muốn sử dụng sudo trên máy chủ:

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

Nhưng điều này cho tôi quyền hạn sudo trên máy cục bộ của tôi, nó yêu cầu mật khẩu sudo của tôi trên máy cục bộ. Có cách nào để sử dụng sudo trên máy chủ không?

BTW: Emacs không được cài đặt trên máy chủ


bạn không thể ra lệnh với quyền root trực tiếp trên máy chủ?
Chmouel Boudjnah

2
Tôi có một người dùng có đặc quyền sudo, nhưng không có mật khẩu gốc.
Fernando Briano

Câu trả lời:


186

Kể từ Emacs 24.3, một multi:cú pháp tương tự của cú pháp cũ đã được xếp lớp trên tramp-default-proxies-alistphương pháp tiếp cận hiện đại , có nghĩa là bạn có thể một lần nữa thực hiện nhiều bước nhảy mà không cần bất kỳ cấu hình trước nào. Để biết chi tiết, hãy xem:

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

Với cú pháp mới, mỗi 'hop' được phân tách bằng |. Ví dụ trong sách hướng dẫn là:

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

Đầu tiên kết nối với tư cách là bird@bastion, và từ đó đếnyou@remotehost:/path

/ su: hoặc / sudo: trên máy chủ từ xa

Bạn cũng có thể sử dụng cú pháp này để sudo / su root (hoặc tất nhiên là bất kỳ người dùng nào khác) trên máy chủ từ xa:

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

Quan trọng : hãy đảm bảo chỉ định tên máy chủ một cách rõ ràng: sudo:remotehost:thay vì sudo::(xem bên dưới).

Vì điều này vẫn sử dụng cơ chế proxy bên dưới, tramp-default-proxies-alistbây giờ sẽ bao gồm giá trị("remotehost" "root" "/ssh:you@remotehost:")

Có nghĩa là proxy /ssh:you@remotehost:sẽ được sử dụng bất cứ khi nào bạn yêu cầu một tệp như root@remotehost.

root là người dùng mặc định cho các phương pháp này, nhưng tất nhiên bạn cũng có thể thay đổi thành người dùng không phải root với:

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

Luôn chỉ định rõ ràng tên máy chủ từ xa

Có thể bạn đã quen với việc sử dụng sudo::hoặc su::bỏ qua tên máy chủ. Nếu bạn đang trên localhost thì điều này vẫn ổn, nhưng nếu bạn đang chuyển đến một máy chủ từ xa thì bạn phải chỉ định tên máy chủ cho mỗi bước nhảy - ngay cả khi nó giống với bước nhảy trước đó. Luôn sử dụng sudo:hostname:hoặc su:hostname:với máy chủ từ xa.

Cái bẫy ở đây là sudo:: không thực sự xuất hiện để làm việc - tuy nhiên khi bạn làm điều đó HOST cho mục proxy năng động sẽ là tên máy bạn có nguồn gốc từ chứ không phải là máy chủ mà bạn kết nối tới. Điều này sẽ không chỉ trông khó hiểu (vì máy chủ lưu trữ sai sẽ được hiển thị trong đường dẫn tệp), mà còn có nghĩa là bất kỳ nỗ lực tiếp theo nào để sử dụng sudo::trên máy chủ cục bộ của bạn thay vào đó sẽ được ủy quyền cho máy chủ từ xa! (và proxy có lẽ cũng sẽ bị che khuất nếu bạn làm điều tương tự trên máy chủ thứ hai, gây ra các vấn đề khác).

Tóm lại, không sử dụng ::khi bạn đa hop!


4
và hiện đã được thêm vào wikemacs cũng như wikemacs.org/index.php/TRAMP . Cảm ơn phils, nó hoạt động tốt.
Ehvince

1
Tôi vừa tìm thấy câu trả lời này, và nó hoạt động tuyệt vời ... ngoại trừ việc tôi có tên máy chủ được định nghĩa trong tệp .ssh / config. Khi tôi nhập /sudo:hostname:/etc/hosts, tôi nhận được những gì bạn mong đợi, nhưng khi tôi nhập /sudo:abbrev:/etc/hosts, tôi nhận được thông báo "Tên viết tắt máy chủ lưu trữ trông giống như một máy chủ từ xa, sudo chỉ có thể sử dụng máy chủ cục bộ". Cái này có sửa được không?
rogerl

2
rogerl: Tôi cũng có .ssh/configcác mục nhập và tôi không gặp bất kỳ vấn đề gì khi sử dụng /ssh:abbrev|sudo:abbrev:/etc/hostscác từ viết tắt tên máy chủ của mình. Có vẻ như bạn không chuyển đến máy chủ trước.
phils

@phils Có lẽ tôi nên đăng câu hỏi này như một câu hỏi mới. Tuy nhiên: tệp cấu hình của tôi trông giống như Máy chủ r Người dùng rlipsett Tên máy chủ odlinux IdentityFile ~ / .ssh / id-rsa.pub và của tôi tramp-default-proxies-alistdường như đúng. Tuy nhiên, hành vi mà tôi mô tả ở trên vẫn tồn tại. Tập tin cấu hình của tôi có bị sai không?
rogerl

Tôi vẫn không rõ liệu bạn có thực sự đang cố gắng sử dụng /sudo:abbrev:/etc/hostsnhư bạn đã đưa ra trong nhận xét trước đây của mình (sai, như đã đề cập) hay bạn đang sử dụng đúng /ssh:abbrev|sudo:abbrev:/etc/hosts. Tệp cấu hình ssh của bạn có lẽ là tốt, vì bạn rõ ràng có thể sử dụng nó theo cách khác.
phils

21

Cập nhật : Mặc dù câu trả lời này đã giải quyết được vấn đề ban đầu, nó được viết cho emacs 20 hoặc 21. Đối với emacs 24, tôi khuyên bạn nên sử dụng câu trả lời của phils vì nó cung cấp nhiều giải thích hơn và được cập nhật.


Tôi nghĩ rằng tên tệp multi-hop trong tramp là những gì bạn đang tìm kiếm.

Bước nhảy đầu tiên sẽ là ssh và bước thứ hai sẽ là sudo.


Cập nhật: Các phiên bản gần đây của emac hỗ trợ nhiều bước nhảy bằng proxy:

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

Sau đó, gọi bằng cách mở:

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

Điều này có vẻ giống như giải pháp, nhưng tôi nhận được: "đa phương pháp không còn được hỗ trợ" Bạn có thể chỉ cho tôi hướng dẫn cập nhật được không?
Fernando Briano

Thông tin Mx, Cs tramp :) Bạn có thể cần xác định một máy chủ giả làm mục tiêu của sudo của bạn và thêm nó vào tramp-default-proxy-alist.
Dave Bacher

2
Tôi không thể làm cho nó chạy trong cấu hình của mình (lỗi 255?), Nhưng dòng sau trong .emacs hoạt động: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
ang mo

Câu trả lời được cập nhật không xác định "gần đây", có elisp không hợp lệ và không hoạt động ngay cả khi bạn sửa nó. Tôi đang sử dụng phiên bản emacs ổn định được phát hành hơn một năm sau khi câu trả lời được cập nhật.
Michael Wolf

1
Các thực câu trả lời như năm 2014 / 24,3 là câu trả lời sau, sử dụng "multi-hop ad-hoc"
TomRoche

7

Tôi đã gặp một số rắc rối với câu trả lời đã chọn. Tuy nhiên, nó hoạt động khi tôi thêm dòng này vào .emacs:

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

Và sau đó thực hiện như sau:

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

Nó hơi khó hiểu vì có thời điểm tôi được nhắc nhập mật khẩu "gốc", nhưng việc nhập mật khẩu của người dùng đã cấp cho tôi quyền truy cập. Nó cũng hoạt động phổ biến trên tất cả các máy chủ trên mạng. Ngoài ra, tôi vẫn có thể làm điều này để không bị root:

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


3
Điều này đã không làm việc cho tôi. Có vẻ như trong Ubuntu, ít nhất là với phiên bản 23.2.1 của Emacs và phiên bản 2.1.18-23.2 của tramp, điều này không hoạt động. Tuy nhiên, điều này hoạt động: info.solomonson.com/content/…
gaizka 14/10/10

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

1
Tôi không thể làm cho một trong các giải pháp trên hoạt động (thêm vào danh sách hoặc đặt-mặc định). Nguyên nhân đầu tiên khiến Emacs bị nghẹt khi khởi động và nguyên nhân thứ hai là "Máy chủ abc.xyz.com' looks like a remote host, sudo 'chỉ có thể sử dụng máy chủ cục bộ" ngay khi tôi nhập dấu hai chấm thứ hai trong "/sudo:abc.xyz.com:". Ý tưởng? Emacs 23.1.1 trên Ubuntu 10.04 LTS.
SabreWolfy

3

Từ trang web cấu hình nhiều bước lang thang

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

Sau đó, bất kỳ

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

sẽ mở tệp bằng sudo sau khi đăng nhập bằng cùng tên người dùng của người dùng đang chạy emacs nhưng trên máy từ xa.


-12

Bạn phải ssh vào máy chủ trước, sau đó bạn phải chạy emacs cục bộ.

Hoặc bạn có thể sử dụng NFS với no_root_squash hoặc bạn có thể thử với máy chủ / máy khách emacs, mặc dù tôi không biết điều gì có thể xảy ra (bản thân tôi không sử dụng emacs)


Tôi đã thử nhưng không thể truy cập tệp dưới dạng root bằng sshfs khi gắn nó với tư cách người dùng thông thường. Tôi đoán nó là một vấn đề thiết lập.
Dan Andreatta

Như Hassan đã lưu ý, no_root_squash nên được sử dụng cẩn thận.
Dan Andreatta

6
-1 vì không trả lời câu hỏi. -1 để đề xuất NFS thay vì SSH. -1 để đề xuất no_root_squash. -1 để đề xuất ứng dụng Emacs, thường sử dụng ổ cắm miền Unix, cho một vấn đề liên lạc từ xa. -1 để chia sẻ về Emacs mà không sử dụng nó.
thúc
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.