Я хочу открыть файл внутри Emacs, который находится на удаленном сервере, с sudo Powers на сервере. Я могу открывать локальные файлы с помощью 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 не установлен на сервере
Ответы:
Начиная с 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 для root (или, конечно, любого другого пользователя) на удаленном хосте:
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
является пользователем по умолчанию для этих методов, но вы, конечно, также можете перейти на пользователя без полномочий root с помощью:C-xC-f
/ssh:you@remotehost|sudo:them@remotehost:/path/to/file
RETВсегда указывайте удаленное имя хоста явно
Вероятно, вы привыкли использовать
sudo::
илиsu::
опускать имя хоста. Если вы остаетесь на локальном хосте, это все еще нормально, но если вы переходите на удаленный сервер, вы должны указать имя хоста для каждого прыжка - даже если оно такое же, как и для предыдущего прыжка. Всегда используйтеsudo:hostname:
илиsu:hostname:
с удаленными хостами.Ловушка в том , что
sudo::
это на самом деле , по всей видимости работы - однако , когда вы делаете что HOST для записи динамического прокси будет имя хоста возник из , а не хозяина вы подключены. Это не только будет выглядеть запутанным (поскольку в путях к файлам будет отображаться неправильный хост), но также будет означать, что любая последующая попытка использованияsudo::
на вашем локальном хосте будет вместо этого перенаправлена на удаленный сервер! (и прокси-сервер также, вероятно, будет заблокирован, если вы сделаете то же самое на втором сервере, что вызовет дополнительные проблемы).Короче говоря, не используйте,
::
когда вы многоскачиваете!Emacs 27+
Начиная с Emacs 27.1 (или Tramp 2.4.2, если используется пакет GNU ELPA)
::
случай работает интуитивно, так что/ssh:you@remotehost|sudo::
будет использоваться повторно,remotehost
а не ваш собственный локальный хост, и поэтому вы не получите неверную запись прокси.Кроме того, подобные
/ssh:you@remotehost|sudo:localhost:
ошибки обнаруживаются и помечаются как ошибки пользователя.Если вы склонны использовать смесь версий Emacs, включая версии до 27 (или вы советуете кому-то другому, кто может использовать более старую версию), то будет безопаснее продолжать рассматривать
::
как небезопасное при многопереходном переключении, чтобы избежать потенциальная неудача. (Т.е. явное указание правильного удаленного хоста останется самым безопасным подходом, если версия Tramp неизвестна.)источник
/sudo:hostname:/etc/hosts
, я получаю то, что вы ожидаете, но когда я печатаю/sudo:abbrev:/etc/hosts
, я получаю сообщение «Аббревиатура хоста выглядит как удаленный хост, sudo может использовать только локальный хост». Это поправимо?.ssh/config
записи, и у меня нет проблем с использованием/ssh:abbrev|sudo:abbrev:/etc/hosts
сокращений имени хоста. Похоже, вы не переходите сначала к хосту.tramp-default-proxies-alist
кажется правильным. Тем не менее, поведение, описанное мною выше, сохраняется. В моем файле конфигурации что-то не так?/sudo:abbrev:/etc/hosts
как вы положите в предыдущий комментарий (который не так, как было упомянуто), или если вы используете правильный/ssh:abbrev|sudo:abbrev:/etc/hosts
. Предположительно, ваш файл конфигурации ssh в порядке, поскольку вы, очевидно, можете использовать его в противном случае.Обновление : хотя этот ответ решил исходную проблему, он был написан для emacs 20 или 21. Для emacs 24 я рекомендую вам использовать ответ phils, потому что он предлагает больше объяснений и актуален .
Я думаю, что имена файлов с несколькими переходами в tramp - это то, что вы ищете.
Первым переходом будет ssh, а вторым - sudo.
Обновление: последние версии emacs поддерживают несколько переходов с использованием прокси:
Затем вызовите, открыв:
источник
У меня возникли проблемы с выбранным ответом. Однако это сработало, когда я добавил эту строку в .emacs:
А затем выполнили следующее:
/sudo:ssh-host:file-on-ssh-host
Это немного сбивало с толку, потому что в какой-то момент мне было предложено ввести пароль «root», но ввод пароля пользователя предоставил мне доступ. Он также универсально работает на всех хостах в сети. Кроме того, я все еще могу сделать это, чтобы не быть root:
/ssh:ssh-host:file-on-ssh-host
источник
abc.xyz.com' looks like a remote host,
sudo 'может использовать только локальный хост», как только я ввожу второе двоеточие в «/sudo:abc.xyz.com:». Идеи? Emacs 23.1.1 в Ubuntu 10.04 LTS.С веб-страницы конфигурации tramp multi-hops
Тогда любой
откроет файл с помощью sudo после входа в систему с тем же именем пользователя, что и пользователь, работающий с emacs, но на удаленном компьютере.
источник
Сначала вы должны подключиться к серверу по ssh, а затем запустить emacs локально.
Или вы можете использовать NFS с no_root_squash, или вы можете попробовать с сервером / клиентом emacs, хотя я понятия не имею, что может случиться (сам не использую emacs)
источник