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

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

Cx Cf /sudo::/home/user/file 

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

 Cx Cf /sudo::[email protected]/home/user/file 

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

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

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

Ch i g (tramp) Ad-hoc multi-hops RET

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

Cx Cf /ssh:[email protected]|ssh:[email protected]:/path RET

Что соединяется во-первых как [email protected] , а оттуда [email protected]:/path

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

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

Cx Cf /ssh:[email protected]|sudo:remotehost:/path/to/file RET

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

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

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

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

Cx Cf /ssh:[email protected]|sudo:[email protected]:/path/to/file RET

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

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

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

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

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


Я думаю, что имена файлов с несколькими хопами в 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 

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

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

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

Тогда любой

 Cx Cf /sudo:remote-host:/file 

откроет файл с помощью sudo после регистрации с тем же именем пользователя, использующего emacs, но на удаленном компьютере.

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

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

  • Как выполнить SCP как пользователя Sudo
  • Почему sudo curl игнорирует настройки прокси-сервера?
  • Как запретить пользователям sudo запускать определенные команды?
  • Добавление строки в файл hosts, получение разрешения отклонено при использовании sudo - Mac
  • Предварительно санкционируйте sudo? (Так что это можно запустить позже)
  • Howto переключить / chage идентификатор пользователя с помощью скрипта bash для выполнения команд в том же скрипте?
  • Потерянный sudo / su на примере Amazon EC2
  • Практичный (ближе к классическому Linux) способ использовать (автоматизировать) SUDO для CygWin
  • Как проверить, есть ли у меня доступ к Sudo?
  • Как добавить в файл как sudo?
  • npm command - sudo или нет?
  • Interesting Posts

    Воспроизведение нескольких аудиоклипов с использованием объектов Clip

    Максимизировать наилучшую практику продления срока службы ленты?

    Я хочу, чтобы приложение для Android работало только в портретном режиме?

    Отключить полноэкранное предупреждение firefox с помощью html5?

    Подсчет вхождений в первый столбец файла

    Групповые столбцы с значениями NaN (отсутствует)

    Как подмножить данные в R без потери строк NA?

    Как разбить одну строку на несколько строк, разделенных хотя бы одним пространством в оболочке bash?

    Попытка добиться более высокой скорости передачи файлов в моей домашней сети

    Призрачное изображение монитора 1 в мониторе 2 с обмотанными вместе кабелями VGA

    Подключение к настройкам прокси-сервера Firefox

    Как поворачивать изображения JPEG на основе метаданных ориентации?

    Ищете способ скопировать файлы в gulp и переименовать на основе родительского каталога

    Logcat не отображает мои логические вызовы

    Где появляется сообщение System.Diagnostics.Debug.Write?

    Давайте будем гением компьютера.