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