Вопрос

Я пытаюсь запустить vncviewer на Raspberry Pi, используя PHP, где RPi является клиентом, а мой VNC-сервер работает под управлением MS Windows.

В PHP я использую этот скрипт для запуска vncviewer

$cmd="echo password | vncviewer -autopass " .$ip;
shell_exec($cmd);

Это работает, когда я запускаю сценарий оболочки только из RPi, но при попытке из PHP я получаю эту ошибку:

Error: Can't open display:

Есть ли обходной путь для этой ошибки?

Это было полезно?

Решение

Если вы используете X11, вам, вероятно, потребуется установить DISPLAY переменная.

Клиенты X11 (программы), которым необходимо открывать окна на сервере X11 (дисплее), используют эту переменную, чтобы определить, где клиент должен найти сервер.Здесь используется модель клиент/сервер, поскольку сервер предоставляет возможности отображения окон клиент.

X включает в себя возможность отображать окна на удаленных серверах по сети, хотя в 99,9% случаев вы будете отображать объекты на главном дисплее компьютера, на котором запущена программа, поэтому обычно DISPLAY=localhost:0.0.

Загвоздка в том, что если DISPLAY является нет установлено, программа не знает, где открыть свои окна, даже если на той же машине работает X-сервер.И когда программы выполняются cron или сценарии запуска системы, или вообще что-либо, что не было запущено самим X (включая сценарий PHP, запускаемый вашим веб-сервером), они обычно не имеют DISPLAY настроен на что угодно.

Так ..как вы заметили в комментариях, установка DISPLAY=:0 сообщит vncviewer, куда отправить свои окна.Это сокращенная форма DISPLAY=localhost:0.0.Имя хоста, если оно исключено, считается локальным.И .0 в конце относится к номеру экрана, который по умолчанию также равен нулю.Проверьте X-документация для получения более подробной информации..

И, как вы также заметили в комментариях, в среде, где работает X (т.е. DISPLAY уже установлено), возможно, вам придется запустить xhost + разрешить программам, не запускаемым X, открывать окна.

Чтобы установить переменную среды в PHP, используйте что-то вроде:

putenv("DISPLAY=:0");

перед кодом, запускающим VNC.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top