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

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

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

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

  • Поддерживает ли сервер 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", примерно на полпути вниз) m, начинающий удивляться, может ли это быть одной из редких вещей, которые 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 в общем терминале.:-) Это поднимает некоторые вопросы, связанные с спуфингом, но, по крайней мере, хост может видеть все, что делают гости.

Ответ 1

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

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

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

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

Вы можете поручить запущенным emacs подключиться к удаленному дисплею и открыть новое окно с помощью M-x 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

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

Ответ 2

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

Из информации emacscient

`--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

Ответ 3

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

Он работает (AFAIU), например:

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

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

Ответ 4

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

http://emacswiki.org/emacs/TrampMode