Вопрос или проблема
Я на системе Ubuntu, у которой на дисплее :0 настроен сенсорный экран. Я хотел иметь возможность удаленно управлять этим сенсорным экраном с Windows, поэтому я настроил x11vnc. Он работает отлично. Но вот настройка:
У меня два пользователя (исключая root). Один ограниченный пользователь (практически без разрешений и без пароля), который автоматически входит на сенсорный экран, и один полностью настроенный пользователь с сложным паролем, правами sudo и т. д. Мне действительно важно только запустить x11vnc, когда ограниченный пользователь входит в систему (сенсорный экран становится активным), поэтому я вставил команду x11vnc -loop &
в конце файла /home/restricted/.profile
. Работает хорошо. Имейте в виду, что это должно быть фоновым процессом, потому что есть другие команды, которые этот пользователь должен выполнять (скрытые от человека) позже.
Проблема, с которой я сталкиваюсь, заключается в том, что x11vnc очень шумный с его выводом. Особенно если вы не используете пароль (а я не использую), и это цикл, поэтому он просто продолжает повторяться. Обычно это не было бы проблемой, но не только перенаправление вывода в /dev/null не работает (объяснено ниже), но и вывод появляется на терминале другого пользователя, когда я входу в него через ssh (что действительно раздражает, потому что я использую эту учетную запись для обслуживания, и ничего сделать невозможно, когда ваш экран заполняется выводом какого-то фонового процесса. Вот пример вывода, который я получаю:
--- x11vnc loop: 1 ---
--- x11vnc loop: waiting for: 1551
###############################################################
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@ @#
#@ ** WARNING ** WARNING ** WARNING ** WARNING ** @#
#@ @#
#@ YOU ARE RUNNING X11VNC WITHOUT A PASSWORD!! @#
#@ @#
#@ This means anyone with network access to this computer @#
#@ may be able to view and control your desktop. @#
#@ @#
#@ >>> If you did not mean to do this Press CTRL-C now!! <<< @#
#@ @#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@ @#
#@ You can create an x11vnc password file by running: @#
#@ @#
#@ x11vnc -storepasswd password /path/to/passfile @#
#@ or x11vnc -storepasswd /path/to/passfile @#
#@ or x11vnc -storepasswd @#
#@ @#
#@ (the last one will use ~/.vnc/passwd) @#
#@ @#
#@ and then starting x11vnc via: @#
#@ @#
#@ x11vnc -rfbauth /path/to/passfile @#
#@ @#
#@ an existing ~/.vnc/passwd file from another VNC @#
#@ application will work fine too. @#
#@ @#
#@ You can also use the -passwdfile or -passwd options. @#
#@ (note -passwd is unsafe if local users are not trusted) @#
#@ @#
#@ Make sure any -rfbauth and -passwdfile password files @#
#@ cannot be read by untrusted users. @#
#@ @#
#@ Use x11vnc -usepw to automatically use your @#
#@ ~/.vnc/passwd or ~/.vnc/passwdfile password files. @#
#@ (and prompt you to create ~/.vnc/passwd if neither @#
#@ file exists.) Under -usepw, x11vnc will exit if it @#
#@ cannot find a password to use. @#
#@ @#
#@ @#
#@ Even with a password, the subsequent VNC traffic is @#
#@ sent in the clear. Consider tunnelling via ssh(1): @#
#@ @#
#@ http://www.karlrunge.com/x11vnc/#tunnelling @#
#@ @#
#@ Or using the x11vnc SSL options: -ssl and -stunnel @#
#@ @#
#@ Please Read the documention for more info about @#
#@ passwords, security, and encryption. @#
#@ @#
#@ http://www.karlrunge.com/x11vnc/faq.html#faq-passwd @#
#@ @#
#@ To disable this warning use the -nopw option, or put @#
#@ 'nopw' on a line in your ~/.x11vncrc file. @#
#@ @#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
###############################################################
20/05/2016 10:53:18 x11vnc version: 0.9.13 lastmod: 2011-08-10 pid: 1551
20/05/2016 10:53:18 XOpenDisplay("") failed.
20/05/2016 10:53:18 Trying again with XAUTHLOCALHOSTNAME=localhost ...
20/05/2016 10:53:18
20/05/2016 10:53:18 *** XOpenDisplay failed. No -display or DISPLAY.
20/05/2016 10:53:18 *** Trying ":0" in 4 seconds. Press Ctrl-C to abort.
20/05/2016 10:53:18 *** 1 2 3 4
Invalid MIT-MAGIC-COOKIE-1 key20/05/2016 10:53:22 XOpenDisplay(":0") failed.
20/05/2016 10:53:22 Trying again with XAUTHLOCALHOSTNAME=localhost ...
Invalid MIT-MAGIC-COOKIE-1 key20/05/2016 10:53:22 XOpenDisplay(":0") failed.
20/05/2016 10:53:22 Trying again with unset XAUTHLOCALHOSTNAME ...
Invalid MIT-MAGIC-COOKIE-1 key20/05/2016 10:53:22
20/05/2016 10:53:22 ***************************************
20/05/2016 10:53:22 *** XOpenDisplay failed (:0)
*** x11vnc was unable to open the X DISPLAY: ":0", it cannot continue.
*** There may be "Xlib:" error messages above with details about the failure.
Некоторые советы и рекомендации:
** Сервер X (тот, который вы хотите просмотреть) должен работать перед запуском x11vnc: x11vnc не запускает X сервер. (тем не менее, смотрите опцию -create, если это именно то, что вы действительно хотите).
** Вы должны использовать -display <disp>, -ИЛИ- установить и экспортировать вашу окружение $DISPLAY, чтобы ссылаться на дисплей желаемого X сервера.
- Обычно дисплей просто ":0" (фактически x11vnc использует это, если вы забудете указать), но в некоторых многопользовательских ситуациях он может быть ":1", ":2" или даже ":137". Спросите вашего администратора или гуру, если у вас есть трудности с определением, каким является ваш X DISPLAY.
** Далее, вам нужно иметь достаточные разрешения (Xauthority) для подключения к X DISPLAY. Вот некоторые советы:
- Обычно вам просто нужно запустить x11vnc от имени пользователя, вошедшего в X сессию. Так что убедитесь, что вы этот пользователь, когда вводите x11vnc.
- Быть root обычно недостаточно, потому что может быть доступен неправильный файл MIT-MAGIC-COOKIE. Файл cookie содержит секретный ключ, который позволяет x11vnc подключаться к нужному X DISPLAY.
- Вы можете явно указать, какой файл MIT-MAGIC-COOKIE следует использовать с помощью опции -auth, например:
x11vnc -auth /home/someuser/.Xauthority -display :0
x11vnc -auth /tmp/.gdmzndVlR -display :0
у вас должны быть права на чтение для файла auth.
См. также '-auth guess' и '-findauth', обсуждаемые ниже.
** Если НИКТО еще не вошел в X сессию, но работает программа приветствия, такая как "gdm", "kdm", "xdm" или "dtlogin", вам нужно будет найти и использовать необработанный файл MIT-MAGIC-COOKIE менеджера дисплея.
Некоторые примеры для различных менеджеров дисплея:
gdm: -auth /var/gdm/:0.Xauth
-auth /var/lib/gdm/:0.Xauth
kdm: -auth /var/lib/kdm/A:0-crWk72
-auth /var/run/xauth/A:0-crWk72
xdm: -auth /var/lib/xdm/authdir/authfiles/A:0-XQvaJk
dtlogin: -auth /var/dt/A:0-UgaaXa
В некоторых случаях команда "ps wwwwaux | grep auth" может раскрыть расположение файла.
Начиная с x11vnc 0.9.9, вы можете заставить его попытаться угадать, используя:
-auth guess
(см. также опцию x11vnc -findauth.)
Только root будет иметь права на чтение этого файла, и поэтому x11vnc должен запускаться от имени root (или копировать его). Случайные символы в именах файлов, разумеется, будут изменяться, и директория, в которой расположен файл cookie, зависит от системы.
Смотрите также: http://www.karlrunge.com/x11vnc/faq.html
--- x11vnc loop: sleeping 2000 ms ---
--- x11vnc loop: 2 ---
И это просто повторяется снова и снова.
Он кричит мне о том, что не может открыть дисплей, но он работает. Я предполагаю, что это потому, что ограниченный пользователь уже выполнил эту команду, и она подключилась нормально, но теперь этот пользователь пытается сделать это тоже, поэтому он не может подключиться.
Почему это происходит? Очевидно, что в моем понимании есть какая-то дыра. Вот разные вещи, которые я попробовал:
Перенаправление вывода в /dev/null
В том же месте, /home/restricted/.profile
я пытался заменить существующую команду x11vnc -loop &
на x11vnc -loop > /dev/null 2>&1 &
.
Это не дало никакого эффекта, вывод по-прежнему был на терминале другого пользователя и (очевидно) не исчез.
Запуск команды с nohup
Снова в /home/restricted/.profile
, я попытался заменить существующую команду x11vnc -loop &
на nohup x11vnc -loop &
.
Снова это не дало никакого эффекта. Вывод все еще был там. Nohup даже не создал файл nohup.out. По крайней мере, я не смог его найти.
Для завершения, я также попробовал nohup x11vnc -loop > /dev/null 2>&1 &
, снова ничего не изменилось.
Запуск x11vnc как демона
Здесь я начал понимать, что делаю что-то не так. Я решил, что, возможно, это потому, что /home/restricted/.profile
— это не то место, чтобы помещать такую вещь. Поэтому я создал скрипт в /etc/init.d
, который будет запускаться при загрузке, и создал ссылку с update-rc.d
согласно примеру скелетного файла.
Снова x11vnc заработал, но вывод был на всех моих терминалах.
Запуск x11vnc в screen
Моя последняя попытка исправить эту ситуацию заключалась в том, чтобы бросить команду в сеанс screen. Screen обычно исправляет такие проблемы для меня… Но не в этот раз.
В /home/restricted/.profile
я заменил x11vnc -loop &
на screen -d -R x11vnc x11vnc -loop
На этот раз x11vnc больше не работал (не удавалось подключиться через Windows клиент), но вывод все еще был на всех терминалах.
Снова, очевидно, что есть что-то, что я не понимаю, либо о x11vnc, либо о запуске процесса при загрузке.
Как вы могли заметить из вышесказанного, я уже некоторое время занимаюсь устранением неполадок и не могу найти ничего другого в Интернете по этому поводу. Поэтому помощь здесь будет отличной. Заранее спасибо.
Перенаправление вывода с помощью >&
сработало для меня.
x11vnc -repeat -noxdamage -ncache 10 -forever -loop -rfbauth &> x11vnc.log
Ответ или решение
Проблема с выводом x11vnc на терминал, как вы описали, может быть решена несколькими способами. Давайте обсудим детали и альтернативные подходы для устранения этой неприятности, чтобы ваш опыт работы с удалённым контролем стал более комфортным.
Понимание проблемы
x11vnc генерирует значительный объём вывода, особенно в крутящемся (loop) режиме. Этот вывод появляется не только в терминале пользователя, который запускает процесс, но и в терминалах других пользователей, что, как вы заметили, мешает работе. Основная задача заключается в том, чтобы перенаправить этот вывод в другое место, например, в файл, чтобы он не мешал нормальному использованию системы.
Решения
1. Запуск x11vnc в фоновом режиме с правильным перенаправлением вывода
Вы уже пробовали несколько методов перенаправления вывода. Обратите внимание, что перенаправление с помощью >&
должно работать, если всё организовано правильно. Пример команды может выглядеть так:
x11vnc -loop > /dev/null 2>&1 &
Убедитесь, что вы добавляете &
в конце команды, чтобы процесс не блокировал выходной поток. Однако, если это не дало результатов, попробуйте перенаправить вывод в файл для анализа.
x11vnc -loop > /home/restricted/x11vnc.log 2>&1 &
Изучив файл x11vnc.log
, вы сможете лучше понять, от чего именно происходит вывод.
2. Использование nohup
Вы также пробовали nohup
, но убедитесь, что вы используете его правильно. Важно, чтобы nohup
не игнорировал выходной поток. Попробуйте следующую команду:
nohup x11vnc -loop > /dev/null 2>&1 &
После выполнения проверьте файл nohup.out
, который находится в вашем текущем каталоге, и убедитесь, что его содержимое пустое или имеет только необходимый вывод.
3. Настройка службы
Создание службы для управления процессом x11vnc — это хороший подход. Пример файла службы может выглядеть так:
[Unit]
Description=Start x11vnc at startup
After=display-manager.service
[Service]
Type=simple
User=restricted
ExecStart=/usr/bin/x11vnc -display :0 -loop -noxdamage -forever -rfbauth /home/restricted/.vnc/passwd > /dev/null 2>&1
Restart=always
[Install]
WantedBy=graphical.target
После создания файла службы (например, /etc/systemd/system/x11vnc.service
), выполните следующие команды:
sudo systemctl enable x11vnc.service
sudo systemctl start x11vnc.service
Это обеспечит автоматический запуск x11vnc при старте системы без вывода на терминал.
Заключение
Проблема с выводом x11vnc может быть решена с помощью должного перенаправления вывода. Важно убедиться, что процессы действительно работают в фоновом режиме и не мешают правам других пользователей.
Если вам необходима дальнейшая помощь, используйте файлы логов для диагностики проблемы и обращения к документации или сообществу, а также проведите дополнительные тесты с различными параметрами запуска.
Несомненно, ваше терпение и настойчивость в решении вопроса принесут плоды, и вы достигнете желаемого результата в настройке удаленного управления вашей сенсорной панелью.