Открыть файл через SSH и Sudo с помощью Emacs

Я хочу открыть файл внутри Emacs, который находится на удаленном сервере с полномочиями sudo на сервере. Я могу открыть локальные файлы с помощью sudo через Tramp следующим образом:

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

Но я хочу использовать sudo на сервере:

C-x C-f /sudo::[email protected]/home/user/file

Но это дает мне полномочия sudo на моей локальной машине, он запрашивает мой пароль sudo на локальной машине. Есть ли способ использовать sudo на сервере?

BTW: Emacs не установлен на сервере

Ответ 1

Как и в Emacs 24.3, аналог старого синтаксиса multi: был наложен поверх современного подхода tramp-default-proxies-alist, что означает, что вы можете снова выполнить многоступенчатые переходы без какой-либо предварительной настройки. Для получения дополнительной информации см.:

C-h i g (tramp) Ad-hoc multi-hops RET

С новым синтаксисом каждый "прыжок" разделяется на |. Пример в руководстве:

C-x C-f /ssh:[email protected]|ssh:[email protected]:/path RET

Что соединяется сначала как [email protected], а оттуда до [email protected]:/path

/su: или /sudo: на удаленных хостах

Вы также можете использовать этот синтаксис для sudo/su для root (или, конечно, любого другого пользователя) на удаленном хосте:

C-x C-f /ssh:[email protected]|sudo:remotehost:/path/to/file RET

Важно. Обязательно укажите имя хоста явно: sudo:remotehost:, а не sudo:: (см. ниже).

Поскольку это все еще использует механизм прокси-сервера внизу, tramp-default-proxies-alist теперь должно включать значение ("remotehost" "root" "/ssh:[email protected]:")

Значение, что прокси /ssh:[email protected]: будет использоваться всякий раз, когда вы запрашиваете файл как [email protected].

root является пользователем по умолчанию для этих методов, но вы, конечно же, можете изменить для пользователя без полномочий root:

C-x C-f /ssh:[email protected]|sudo:[email protected]:/path/to/file RET

Всегда указывать имя удаленного хоста явно

Вероятно, вы используете sudo:: или su:: и опускаете имя хоста. Если вы остановились на локальном хосте, это все равно, но если вы прыгаете на удаленный сервер, вы должны указать имя хоста для каждого прыжка - даже если это то же самое, что и для предыдущего прыжка. Всегда используйте sudo:hostname: или su:hostname: с удаленными хостами.

Ловушка здесь заключается в том, что sudo:: действительно работает, однако, когда вы делаете это, HOST для записи динамического прокси-сервера будет именем хоста, из которого вы возникли, а не с хостом, к которому вы подключились. Это будет не только запутывать (поскольку неправильный хост будет отображаться в пути к файлам), но это также означает, что любая последующая попытка использовать sudo:: на вашем локальном хосте вместо этого будет проксирована на удаленный сервер! (и прокси-сервер также предположительно был бы сбит, если бы вы сделали то же самое на втором сервере, что вызвало дополнительные проблемы).

Короче говоря, не используйте :: при многократном переходе!

Ответ 2

Обновление. Хотя этот ответ решил исходную проблему, он был написан для emacs 20 или 21. Для emacs 24 я рекомендую использовать phils answer, потому что он предлагает больше объяснений и обновляется.


Я думаю, что имена файлов multi-hop в tramp - это то, что вы ищете.

Первый прыжок будет ssh, а второй будет sudo.


Обновление: последние версии emacs поддерживают несколько переходов с помощью прокси:

(add-to-list 'tramp-default-proxies-alist ("my-sudo-alias" nil "/ssh:[email protected]"))

Затем вызовите, открыв:

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

Ответ 3

У меня были некоторые проблемы с выбранным ответом. Однако, это сработало, когда я добавил эту строку в .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

Ответ 4

Из веб-страницы конфигурации мультиплеера tramp

 (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, но на удаленном компьютере.

Ответ 5

Сначала вы должны ssh на сервере, затем вы должны запускать emacs локально.

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