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