Открыть файл через SSH и Sudo с Emacs - PullRequest
106 голосов
/ 01 февраля 2010

Я хочу открыть файл внутри 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 на сервере?

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

Ответы [ 5 ]

169 голосов
/ 07 мая 2013

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

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

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

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

Который подключается сначала как bird@bastion, а оттуда к you@remotehost:/path

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

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

C-x C-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 является пользователем по умолчанию для этих методов, но вы, конечно, также можете перейти к пользователю без полномочий root с помощью:

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

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

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

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

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

21 голосов
/ 01 февраля 2010

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


Я думаю, имена файлов с несколькими прыжками в tramp - это то, что вы ищете.

Первый прыжок будет 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
7 голосов
/ 30 июня 2010

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

С веб-страницы конфигурации 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, но на удаленной машине.

0 голосов
/ 01 февраля 2010

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

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

...