Я новичок в Linux и установил следующую версию Ubuntu в качестве виртуальной машины VirtualBox с помощьюэтот процесс:
ubuntu-20.04.3-desktop-amd64.iso
Первая созданная учетная запись была учетной записью администратора. Я установил xsel
и проверил, что она работает. Затем я создал учетную запись без прав администратора и su
вошел в нее с помощью su - non-admin-account
. В этот момент xsel
жалуется:
xsel: Can't open display: (null)
: Inappropriate ioctl for device
Что мне нужно сделать, чтобы сделать аккаунт xsel
доступным после su
входа в другой аккаунт?
В настоящее время я не заинтересован в запуске приложений, которые запускают собственные клиентские окна при su
входе в учетную запись без прав администратора. Я просто хочу простой конвейерстандартный выходв буфер обмена, чтобы я мог извлечь его в Vim или командной строке Bash с помощью Shift+Ins, например, echo dog | xsel -ib
или echo dog | xsel -ip
.
Мой текущий план — написать или перенаправить (скажем) /tmp/tmp.txt
для передачи текста между пользователем, который вошел в систему с экрана входа, и тем, который был su
d. Я привык к поведению Cygwin, где буфер обмена является общим независимо от того, под какой учетной записью запущен терминал.
Поиск неисправностей
Я сталкиваюсь с одинаковым поведением, если вхожу в учетную запись без прав администратора и su
в учетную запись администратора. xsel
Работает в учетной записи без прав администратора, в которую я вхожу, но не в учетной записи администратора, в которую я su
вхожу.
По сути, xsel
не работает после su
.
Согласно комментариям, я посмотрел наответы на эту проблему. Я не узнаю описание проблемы, так как сообщения об ошибках совершенно разные, поэтому тот, кто ищет на основе сообщений об ошибках, не узнает этот вопрос. Более того, я не понимаю ответы. Часть, которая, казалось, могла бы быть применима к моему решению, была xhost +localhost
, но она не сработала, потому что синтаксис неправильный, по крайней мере для версии Ubuntu, которую я использую. Я публикую синтаксис, которыйделаетработа в моем ответе ниже.
Я думаю, что прежде чем эта процитированная выше страница сможет хотя бы отдаленно информировать кого-то, вы должны знать, что проблема заключается в отсутствии разрешения для учетной записи на доступ к X-серверу. Например, если вы имеете опыт использования X-windows от Cygwin, вы, вероятно, не догадаетесь об этом, потому что проблема там не проявляется.
решение1
Вы можете использоватьpam_xauth
модуль аутентификации для пересылки файлов cookie сеанса X11 между su
вызовами, без открытия вашего X-сервера для этих пользователей в целом.
Это также позволяет осуществлять детальный контроль над тем, какие пользователи могут пересылать учетные данные другим пользователям, с помощью файлов конфигурации в их $HOME/.xauth/
каталогах.
решение2
На основевалтинаторкомментарий, я нашелэта страницапо использованию xhost
. Из этой информации я обнаружил следующее, что работает:
# Log into admin-username from the login screen,
# then issue:
$ xhost +SI:localuser:nonadmin-username
localuser:nonadmin-username being added to access control
list.
$ xhost
SI:localuser:nonadmin-username
SI:localuser:admin-username
$ su - nonadmin-username
# Enter password when prompted
# Match DISPLAY to its value in the admin account
$ export DISPLAY=:0
$ ls | xsel -ip # Use PRIMARY selection e.g. X-windows mouse highlighting
$ ls | xsel -ib # Use CLIPBOARD buffer e.g. Windows's Ctrl+C/X/V
$ exit # Exit the "su" session
# Paste then works in admin account as expected.
# To test the PRIMARY selection:
$ cat # In admin account
# Paste using middle mouse button or Shift+Ins
Ctrl+D to end input into "cat"
Полезной альтернативой добавлению пользователей по одному является xhost +local:
, которая позволяет любому локальному пользователю открывать клиентские окна. Это подразумевает, что вы доверяете всем, кто вошел в систему на машине. Поэтому это следует делать только в контролируемых средах, например, на однопользовательских машинах.
Во многих средах ПЕРВИЧНЫЙ выбор также можно вставить в [G]Vim из регистра *
.
Аналогично буфер БУФЕРА ОБМЕНА часто можно вставить в [G]Vim из регистра +
или из любого другого приложения, использующего Ctrl+V.