Открыть файл через 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 на сервере?
- Sudoedit: зачем использовать его поверх sudo vi?
- Что такое + в конце разрешений Unix в длинном листинговом формате?
- Как использовать su для выполнения остальной части сценария bash как этого пользователя?
- npm / yoman установить генератор-угловой без sudo
- Sudo с паролем в одной командной строке?
BTW: Emacs не установлен на сервере
- Допустимо ли и безопасно ли запускать pip install в sudo?
- SSH: выполнить команду sudo
- Запустить rsync с правами root на удаленной машине
- Почему wget дает ошибку при выполнении с sudo, но отлично работает без?
- Разрешить пользователям определенной группы запускать команду без sudo
- Как установить путь для команд sudo
- Scp для удаленного сервера с sudo
- Как написать скрипт для sudo последней команды
Начиная с версии 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 самостоятельно)