Использование сервера 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