Использование сервера Emacs и emacsclient на других машинах в качестве других пользователей

Я знаю что после звонка (start-server) внутри существующей сессии Emacs я могу использовать emacsclient -c (на том же компьютере), чтобы создать новые кадры, которые подключаются к этому серверу, так что каждый новый кадр создается emacsclient имеет доступ к одному и тому же набору общего состояния (например, буферам).

Большая часть документации, которую я нашел, фокусируется на сценарии использования "предоставь мне быстрый доступ к моему локальному Emacs", и поэтому есть две вещи, о которых я еще не видел никаких деталей:

  1. Можно emacsclient -c получать доступ к серверам Emacs, запущенным другими пользователями, или это сложно для обнаружения только сессий, запущенных моим собственным пользователем?

  2. Поддерживает ли сервер Emacs (прямо или косвенно) удаленные соединения? То есть есть какой-то способ настроить Emacs (возможно, с использованием SSH), который позволяет вызовам emacsclient -c на удаленных машинах иметь доступ к локальному состоянию моего сервера Emacs?

(Если вы еще не догадались, в конечном итоге я хотел бы объединить две вышеописанные методики для обеспечения элементарной поддержки совместного редактирования.)


Это реальная проблема, вот с чем я работаю:

  • Необходимая функциональность уже должна быть встроена в Emacs (23.3.1, 64-битная версия). Я могу использовать расширения Emacs из стандартных репозиториев Ubuntu, но я бы предпочел этого не делать. (Что, я считаю, исключает Руделя, к сожалению.)
  • Нет новых пользователей или подмена пользователей. Решения должны работать с существующим набором учетных записей пользователей, и пользователи не должны притворяться другими пользователями (например, через su или же ssh).

Если это имеет какое-либо значение, машины находятся в частной локальной сети, на них установлены (и работают) клиенты и серверы OpenSSH, и все пользователи могут подключаться (со своей учетной записью) ко всем машинам, но у них нет общей файловой системы.


Итак, кто-нибудь знает, может ли сервер Emacs

  • предоставить доступ другим пользователям, или
  • обеспечить удаленный доступ?

РЕДАКТИРОВАТЬ

Как отмечено в ответе rwb, ясно, что новые окна открываются локально при запуске emacsclient -c фактически создаются процессом удаленного сервера Emacs. То есть, emacsclient просто вызывает соответствующее поведение на сервере. Это вызывает некоторые проблемы с неправильными настройками дисплея, поскольку сервер обычно не имеет доступа к локальному рабочему столу (см. Ниже). Однако теперь я могу подключиться к удаленному сеансу Emacs, если я использую следующую последовательность команд:

В одном терминале, где 1.22.333.44 это IP-адрес remotehost:

ssh -t -X remotehost \
  "emacs -nw --eval
   '(progn (setq server-host \"1.22.333.44\" server-use-tcp t) (server-start))'"

Затем в другой (на той же машине):

scp remotehost:.emacs.d/server/server /tmp/server-file
DISPLAY=localhost:10 emacsclient -c -f /tmp/server-file

emacsclient команда вызывает удаленный сервер Emacs (подробности которого он находит в /tmp/server-file), чтобы открыть графическое окно Emacs (на локальном дисплее), которое разделяет состояние с сеансом Emacs на удаленном хосте.

Поскольку удаленный сервер Emacs был запущен через ssh -X, SSH предоставляет ему доступ к моему локальному дисплею через "фальшивку" :10 дисплей. DISPLAY=:10 перешел к нему (через emacsclient), таким образом, вызывает открытие окна на моем локальном рабочем столе.


Хотя в приведенном выше подходе установлен флажок "Запустить сервер Emacs на удаленной машине, подключитесь к нему с помощью emacsclient "локально", он очень ограничен. Фактически, он не сильно отличается от запуска сервера и клиентов локально как один пользователь: единственное отличие состоит в том, что сервер теперь удален, поэтому имеет доступ к различным системным ресурсам.

К сожалению, запуск через ssh -X это единственный способ, которым я смог успешно открыть окно на X-сервере другой машины:

  • Указание базового DISPLAY=remote:0 никуда не денется (поскольку серверы Ubuntu X запускаются с -nolisten tcp опция).

  • Подключение через SSH с последующим использованием DISPLAY=:0 также не удается, но на этот раз только из-за отсутствия подходящих учетных данных аутентификации. (Я верю, что это так, в любом случае: сообщение об ошибке загадочно говорит No protocol specified / Can't open display.)

Я думаю, что решение второй проблемы, вероятно, приблизило бы меня к решению.


Прочитав посты по адресу http://comments.gmane.org/gmane.emacs.devel/103350 (начиная с поста "25 октября 14:50", примерно на полпути вниз), я начинаю задаваться вопросом, может ли это быть одна из редких вещей, которые Emacs не может сделать (т. е. невозможно;-)).

Однако, если у кого-то есть способ предоставить доступ к удаленным дисплеям X без вышеуказанной ошибки разрешений, я по-прежнему открыт для убеждения....

TL; DR

Как указано в ответе rwb, мои вопросы выше о том, может ли Emacs предоставлять удаленный доступ, обернулись. Там нет реальной проблемы с Emacs, предоставляя доступ другим пользователям (server-use-tcp и подходящий server-file позаботьтесь об этом): скорее проблема в том, как разрешить процессу на одном компьютере открывать новые окна X на дисплеях X других пользователей (в частности, Emacs работает (start-server) необходимо открыть окна для пользователей, которые просят это через emacsclient -c). Этот ответ выходит за рамки этого вопроса.

Альтернативное решение

В качестве обходного пути мы используем следующее:

  • machine0: tmux -S /tmp/shared-tmux-socket new-session
  • machine1..machineN: ssh -t machine0 tmux -S /tmp/shared-tmux-socket attach

с подходящими правами доступа к файлам на /tmp/shared-tmux-socket,

Затем мы запускаем Emacs в текстовом режиме в общем терминале.:-) Это поднимает некоторые вопросы, связанные с подделкой пользователей, но, по крайней мере, хозяин может видеть все, что делают гости.

4 ответа

Решение

Я думаю, что то, о чем вы просите, невозможно по определению, потому что, если вы предоставляете удаленному пользователю неограниченный доступ к вашему Emacs, это такая же "подмена пользователя", как и предоставление удаленному пользователю доступа к оболочке через ssh. Проще говоря, с точки зрения безопасности это, вероятно, плохая идея.

Кроме того, результаты предоставления двум пользователям доступа к одному Emacs не так хороши, как вы могли бы надеяться. Он не предназначен для одновременного доступа. Прошло много лет с тех пор, как я это попробовал, так что, возможно, дела пошли немного дальше, но когда я это сделал, это было странно, если не сказать больше.

Тем не менее, я постараюсь ответить на ваш вопрос.

Похоже, что вы думаете об этом задом наперед, потому что, по-интуитивно, с точки зрения сети, дисплей X11 - это сервер, а приложение X11 - клиент. Это удивительно, потому что обычно отображение является локальным для пользователя, а приложение работает на каком-то удаленном сервере.

Вы можете указать запущенному emacs подключиться к удаленному дисплею и открыть новое окно с Mx make-frame-on-display. Чтобы это работало, владелец этого дисплея должен предоставить вам доступ к нему.

Мы будем предполагать host-l это компьютер под управлением Emacs, и вы хотите сделать его доступным для пользователя с дисплеем 0 на host-r, Имейте в виду, что вы сказали, что не хотите использовать пересылку SSH, поэтому следование этому методу приведет к тому, что весь трафик будет проходить через сеть в незашифрованном виде.

Во-первых, убедитесь, что дисплей host-r:0 принимает TCP-соединения. Вы не упоминаете свою операционную систему, но это, вероятно, по умолчанию в Unix и, вероятно, не в Linux (по соображениям безопасности). Если, например, следующие упоминания -nolisten tcp тогда вам нужно будет изменить эту конфигурацию.

host-r$ ps -ef | grep X

Затем попросите пользователя host-r выполнить следующую команду и отправить вам вывод. Обязательно предупредите их, что это позволит вам полностью контролировать текущий сеанс рабочего стола, если вы решите.

host-r$ xauth list $DISPLAY
host-r/unix:0  MIT-MAGIC-COOKIE-1  01234567890abcdef0123456789abcd

По сути, это "пароль" для дисплея. На host-lпоместите его там, где Emacs сможет найти его:

host-l$ xauth add host-r:0 MIT-MAGIC-COOKIE-1  01234567890abcdef0123456789abcd

Теперь введите Mx make-frame-on-display host-r:0, и на удаленном дисплее должно появиться окно Emacs.

Это должно обеспечить отправную точку для того, что вы хотите.

Из информационного узла (emacs) Опции emacsclient

`--server-file=SERVER-FILE'
     Specify a "server file" for connecting to an Emacs server via TCP.

     An Emacs server usually uses an operating system feature called a
     "local socket" to listen for connections.  Some operating systems,
     such as Microsoft Windows, do not support local sockets; in that
     case, Emacs uses TCP instead.  When you start the Emacs server,
     Emacs creates a server file containing some TCP information that
     `emacsclient' needs for making the connection.  By default, the
     server file is in `~/.emacs.d/server/'.  On Microsoft Windows, if
     `emacsclient' does not find the server file there, it looks in the
     `.emacs.d/server/' subdirectory of the directory pointed to by the
     `APPDATA' environment variable.  You can tell `emacsclient' to use
     a specific server file with the `-f' or `--server-file' option, or
     by setting the `EMACS_SERVER_FILE' environment variable.

     Even if local sockets are available, you can tell Emacs to use TCP
     by setting the variable `server-use-tcp' to `t'.  One advantage of
     TCP is that the server can accept connections from remote machines.
     For this to work, you must (i) set the variable `server-host' to
     the hostname or IP address of the machine on which the Emacs server
     runs, and (ii) provide `emacsclient' with the server file.  (One
     convenient way to do the latter is to put the server file on a
     networked file system such as NFS.)

Вы также можете посмотреть на переменные server-auth-dir, server-auth-key а также server-port

Аарон Галлахер реализовал решение: http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/

Это работает (AFAIU) как:

  • Сервер Emacs запускается с TCP
  • Он открывает соединение с удаленной системой с помощью tramp-sh, открывая прямой порт ("обратный канал")
  • tramp-sh рекомендуется скопировать расширенный файл cookie авторизации в удаленную систему
  • В удаленной системе он вызывает специальный сценарий оболочки emacsclient.sh, который эмулирует emacsclient, но префиксирует имена файлов с соответствующим префиксом tramp, который находится в расширенном файле cookie авторизации.

Я добавил комментарий к его сообщению в блоге, предлагающий обсудить и улучшить эту идею на emacs-devel.

Если вы делаете это, чтобы позволить людям удаленно редактировать файлы, вы можете посмотреть на "режим бродяг"

http://emacswiki.org/emacs/TrampMode

Другие вопросы по тегам