Відкрийте файл через 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 на сервері?

BTW: Emacs не встановлений на сервері


Ви не можете командувати як root безпосередньо на сервері?
Chmouel Boudjnah

2
У мене є користувач із правами sudo, але не кореневим паролем.
Фернандо Бріано

Відповіді:


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::у вашому localhost замість цього буде передана на віддалений сервер! (і, мабуть, проксі-сервер також може бути халопним, якщо ви зробили те саме на другому сервері, що спричинило подальші проблеми).

Коротше кажучи, не використовуйте, ::коли ви мульти-хоп!


4
а тепер додається до wikemacs також wikemacs.org/index.php/TRAMP . Дякую філам, це чудово працює.
Переконати

1
Я щойно знайшов цю відповідь, і вона чудово працює ... за винятком того, що у мене є скорочена назва хоста, визначена у .ssh / config-файлі. Коли я набираю текст /sudo:hostname:/etc/hosts, я отримую те, що ви очікували, але коли я набираю /sudo:abbrev:/etc/hosts, я отримую повідомлення "Скорост хоста схожий на віддалений хост, судо може використовувати лише локальний хост". Це можна виправити?
rogerl

2
rogerl: У мене також є .ssh/configзаписи, і у мене немає жодних проблем із використанням /ssh:abbrev|sudo:abbrev:/etc/hostsскорочень мого імені хоста. Схоже, ви не сподіваєтесь на хоста спочатку.
філ

@phils Можливо, я повинен поставити це як нове запитання. Однак: мій конфігураційний файл схожий на 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 config-файл, мабуть, добре, оскільки ви, очевидно, можете використовувати його інакше.
філс

21

Оновлення : Хоча ця відповідь вирішила оригінальну проблему, вона була написана для emacs 20 або 21. Для emacs 24 я рекомендую використовувати відповідь phils, оскільки вона пропонує більше пояснень і актуальна.


Я думаю, що мульти-хоп-файли в бродязі - це те, що ти шукаєш.

Перший скачок був би ssh, а другий - sudo.


Оновлення: Останні версії emacs підтримують декілька хмелів за допомогою проксі-серверів:

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

Потім викликайте, відкривши:

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

Це здається рішенням, але я отримую: "мульти метод більше не підтримується" Чи можете ви вказати мені на оновлений посібник?
Фернандо Бріано

Mx info, Cs tramp :) Можливо, вам потрібно буде визначити підроблений хост як ціль вашого судо і додати його до tramp-default-proxy-alist.
Дейв Бахер

2
Я не міг запустити його в моїй конфігурації (помилка 255?), Але наступний рядок у .emacs працює: (set-default 'tramp-default-proxy-alist (quote (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
англ

Оновлена ​​відповідь не визначає "нещодавній", недійсний elisp і не працює, навіть якщо ви виправляєте його. Я на стабільній версії emacs, випущеній через рік після оновленої відповіді.
Майкл Вольф

1
Реальний відповідь від 2014 / 24.3 є такою відповіддю, використовуючи «незаплановані мульти-хміль»
TomRoche

7

У мене були проблеми з обраною відповіддю. Однак це спрацювало, коли я додав цей рядок до .emacs:

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

А потім виконали наступне:

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

Це було дещо заплутано, оскільки в один момент мені запропонували пароль "root", але введення пароля користувача дозволило мені отримати доступ. Він також універсально працює на всіх хостах у мережі. Крім того, я все ще можу зробити це, щоб не мати root:

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


3
Це не працювало для мене. Схоже, що в Ubuntu, принаймні, з версією 23.2.1 Emacs та версією 2.1.18-23.2 Tramp це не працює. Це працює, хоча: info.solomonson.com/content/…
gaizka

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

1
Я не в змозі змусити жодне з вищезазначених рішень працювати (додавання до списку чи встановлення за замовчуванням). Перший змушує Emacs задихатися при запуску, а другий дає мені "Host abc.xyz.com' looks like a remote host, sudo" може використовувати лише локальний хост ", як тільки я ввійду у другу двокрапку в" /sudo:abc.xyz.com: ". Ідеї? Emacs 23.1.1 на Ubuntu 10.04 LTS.
SabreWolfy

3

З веб-сторінки конфігурації мульти-хопів

 (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 на сервер, а потім запустити emacs локально.

Або ви можете використовувати NFS з no_root_squash, або ви можете спробувати сервер / клієнт emacs, хоча я поняття не маю, що може статися (не використовуйте emacs сам)


Я намагався, але я не можу отримати доступ до файлів як root із sshfs, монтуючи його як звичайний користувач. Я думаю, це проблема налаштування.
Dan Andreatta

Як зазначив Хассан, no_root_squash слід використовувати обережно.
Dan Andreatta

6
-1 за те, що не відповів на запитання. -1 за пропозицію NFS замість SSH. -1 за пропозицію no_root_squash. -1 для запропонування клієнта Emacs, який зазвичай використовує розетки домену Unix для вирішення проблеми віддаленого зв'язку. -1 для того, що беріг про Emacs, не використовуючи його.
закінчення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.