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

114

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

Фернандо Бриано
источник
Вы не можете управлять как root прямо на сервере?
Chmouel Boudjnah 01
2
У меня есть пользователь с привилегиями sudo, но не с паролем root.
Фернандо Бриано,

Ответы:

186

Начиная с 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 неизвестна.)

Phils
источник
4
и теперь добавлен в wikemacs, а также на wikemacs.org/index.php/TRAMP . Спасибо phils, отлично работает.
Ehvince
1
Я только что нашел этот ответ, и он отлично работает ... за исключением того, что у меня есть сокращенное имя хоста, определенное в файле .ssh / config. Когда я печатаю /sudo:hostname:/etc/hosts, я получаю то, что вы ожидаете, но когда я печатаю /sudo:abbrev:/etc/hosts, я получаю сообщение «Аббревиатура хоста выглядит как удаленный хост, sudo может использовать только локальный хост». Это поправимо?
rogerl
2
rogerl: У меня тоже есть .ssh/configзаписи, и у меня нет проблем с использованием /ssh:abbrev|sudo:abbrev:/etc/hostsсокращений имени хоста. Похоже, вы не переходите сначала к хосту.
phils
@phils Возможно, мне стоит опубликовать это как новый вопрос. Однако: мой конфигурационный файл выглядит как Host r User rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub, и my tramp-default-proxies-alistкажется правильным. Тем не менее, поведение, описанное мною выше, сохраняется. В моем файле конфигурации что-то не так?
rogerl
Это до сих пор мне не ясно , являются ли вы на самом деле пытаетесь использовать , /sudo:abbrev:/etc/hostsкак вы положите в предыдущий комментарий (который не так, как было упомянуто), или если вы используете правильный /ssh:abbrev|sudo:abbrev:/etc/hosts. Предположительно, ваш файл конфигурации ssh в порядке, поскольку вы, очевидно, можете использовать его в противном случае.
phils
21

Обновление : хотя этот ответ решил исходную проблему, он был написан для 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
Дэйв Бачер
источник
Это похоже на решение, но я получаю: «несколько методов больше не поддерживаются» Вы можете указать мне на обновленное руководство?
Фернандо Бриано
Mx info, Cs tramp :) Возможно, вам потребуется определить поддельный хост в качестве цели вашего sudo и добавить его в tramp-default-proxy-alist.
Дэйв Бачер,
2
Мне не удалось запустить его в моей конфигурации (ошибка 255?), Но работает следующая строка в .emacs: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil " / SSH: пользователь @ SSH-хоста: "))))
анг мес
Обновленный ответ не определяет «недавний», имеет недопустимый elisp и не работает, даже если вы его исправляете. Я использую стабильную версию emacs, выпущенную через год после обновленного ответа.
Michael Wolf
1
Реальный ответ от 2014 / 24.3 является следующим ответом, используя «незапланированные мульти-хмель»
TomRoche
7

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

Пользователь1
источник
3
У меня это не сработало. Похоже, что в Ubuntu, по крайней мере, с версией 23.2.1 Emacs и версией 2.1.18-23.2 tramp это не работает. Но это работает: info.solomonson.com/content/…
gaizka
(set-default 'tramp-default-proxies-alist (quote ((". *" "\` root \\' "" / ssh:% h: ")))))
gaizka
1
Я не могу заставить работать ни одно из вышеперечисленных решений (добавить в список или установить по умолчанию). Первый заставляет Emacs подавиться при запуске, а второй дает мне «Хост abc.xyz.com' looks like a remote host, sudo 'может использовать только локальный хост», как только я ввожу второе двоеточие в «/sudo:abc.xyz.com:». Идеи? Emacs 23.1.1 в Ubuntu 10.04 LTS.
SabreWolfy
3

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

вамполо
источник
-12

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

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

Дэн Андреатта
источник
Я пробовал, но не могу получить доступ к файлам как root с помощью sshfs, когда монтирую его как обычный пользователь. Думаю, это проблема с настройкой.
Дэн Андреатта,
Как заметил Хасан, no_root_squash следует использовать с осторожностью.
Дэн Андреатта,
6
-1 за то, что не ответил на вопрос. -1 за предложение NFS вместо SSH. -1 за предложение no_root_squash. -1 за предложение клиента Emacs, который обычно использует сокеты домена Unix, для решения проблемы удаленной связи. -1 за болтовню об Emacs без его использования.
Ceving 02