решение1
Вы можете использовать VNC, см. этот раздел вопросов и ответов:https://softwarerecs.stackexchange.com/questions/20417/same-content-on-several-different-computers-monitors-administered-remotely/20419#20419.
Сервер VNC может совместно использоваться несколькими клиентами в режиме «только чтение» (т. е. клиенты не могут управлять сервером с помощью клавиатуры или мыши) или в режиме «чтение и запись» (клиенты могут управлять сервером с помощью клавиатуры или мыши, но ситуация может стать сложной, когда несколько клиентов одновременно имеют контроль над записью, поскольку они могут мешать друг другу).
В большинстве последних дистрибутивов Linux поддержка VNC встроена в сам сервер X11, но ее может потребоваться включить (инструкции см. в документации к вашему дистрибутиву). В качестве альтернативы вы можете запустить сервер вручную, полностью независимо от «главного» сервера X11, работающего на машине. При ручном запуске сервер VNC может одновременно поддерживать как «только для чтения», так и «для чтения и записи» клиентов, использующих разные пароли (не уверен, поддерживает ли это встроенная поддержка сервера X11).
VNC прекрасно работает через SSH, и клиентам даже не нужны права root для выполнения.
решение2
Целью было распространение любого выбранного образа/программы на ~30 рабочих столов Linux, независимо от того, вошел ли пользователь в систему или нет, содержимое должно заменять то, что просматривал пользователь (подумайте о PSA), а реальные задачи рабочего стола пользователя должны оставаться нетронутыми. Более того, пользователю не должна быть предоставлена возможность изменять содержимое. Я надеялся на базовое решение с использованием широковещательных рассылок X и TCP. Это не получило развития, вместо этого я использовал VNC, как рекомендовали другие.
На стороне клиента я настроил ожидаемый скрипт для запуска пустого Xsession (например, X :1
), переключения на этот виртуальный терминал (т. е. chvt 1
при необходимости) и подключения к vncserver.
А именно:
for num in $(seq 0 30); do expect -f xremote$num.exp; done
где каждый скрипт xremote указывает удаленный хост:
set timeout -1
spawn ssh -o ConnectTimeout=10 root@somehost1
match_max 100000
expect "#"
send "X :1 & \r"
expect "#"
send "export DISPLAY=:1 \r"
expect "#"
send "vncviewer -passwd /root/.vnc/passwd -Shared -ViewOnly -FullScreen 192.168.1.1:1& \r"
expect "#"
send "exit\r"
expect eof
exit 0
и сервер выдает контент на :1 после:
vncserver :1 -geometry 1024x768 -depth 16
После этого стало немного сложнее закрывать Xsessions на клиентах. Поэтому я использовал следующий сценарий ожидания, чтобы закрыть все Xsessions [X перезапускается автоматически на :0] :
set timeout -1
spawn ssh -o ConnectTimeout=10 root@somehost1
match_max 100000
expect "#"
send "pkill X \r"
expect "#"
send "chvt 1 \r"
expect "#"
send "rm /tmp/.X*lock \r"
send "exit\r"
expect eof
exit 0