我正在制作一个x11vnc
启动脚本,该脚本将修复可怕的黑屏,该黑屏会阻止您在重新启动之前使用 VNC。到目前为止,我已经设法通过使用最新/run/sddm/*
文件并更改:0
为找到解决方法n-1那里相应的文件。但这只是猜测,只有当用户切换仅在末尾添加一个显示会话然后将其删除时,它才会起作用。一旦您尝试切换回使用不是最后一个的项目,问题就会再次出现,因为我无法判断正在使用哪个显示器。到目前为止我的进展:
#!/bin/sh
while true; do
lso=`ls -t /run/sddm/{* | grep -m1 -`
cnt=$((`ls /run/sddm/{* | grep -c -`-1))
/usr/bin/x11vnc -auth $lso -once -noxdamage -repeat -rfbauth /home/USER/.vnc/passwd -rfbport 5900 -shared -display :$cnt
usleep 400000
done
亮点是我摆脱了-forever
并-loop
让它重新加载服务器并在每次连接后为其提供新的显示配置。
我需要当前的显示,例如:0
或:1
来找到正确的 X cookie 文件(如果我知道显示编号,我就可以做到这一点)和正确的输出以使其显示正确的监视器图片。
在具有所有更新的 Kubuntu 18.04 上运行。
答案1
如果你想找到当前linux vt中运行的Xorg服务器的显示编号(否Xvfb
或xnest
),那么也许这可以(完成@basin的)评论)
pgrep -at "$(cat /sys/class/tty/tty0/active)" Xorg | grep -Po ' \K:[0-9]+'
-t tty
pgrep 选项将选择具有控制终端的进程,tty
并且该-a
选项将指示它打印整个命令行;第二个 grep 将从中提取显示编号。
当然,如果用户通过 Ctrl-Alt-Fn 切换到文本控制台,则不会打印任何内容。
答案2
我终于弄明白了。感谢比利叔叔为我指明了正确的方向(尽管他的第二次编辑仍然对我不起作用)。
#!/bin/sh
while true; do
lso=/run/sddm/`pgrep -at "$(cat /sys/class/tty/tty0/active)" Xorg | grep -Po '\{[0-9a-f\-]{36}\}'`
cnt=`cat -v $lso | grep -Po '\^[A-C]{1}[0-9]{1,3}\^@\^RMIT' | grep -Po '[0-9]{1,3}'`
/usr/bin/x11vnc -auth $lso -once -noxdamage -repeat -rfbauth /home/USER/.vnc/passwd -rfbport 5900 -display :$cnt
usleep 400000
done
它的工作原理如下:该变量lso
需要包含当前 X-cookie 文件的完整路径。这就是比利叔叔的建议的用武之地。虽然行输出中没有显示编号pgrep
,但 GUID 样式的 X-cookie 是。这就是我粗略地grep
没有考虑括号包围的十六进制字符串中连字符的确切位置。
该cnt
变量需要包含显示编号。我从 X-cookie 本身中提取它。将二进制字符转换cat -v
为脱字符转义的控制字符。然后,我将这些二进制字符与 X-cookie 文件中显示编号周围的字符进行匹配。该[A-C]{1}
部分实际上是显示编号的长度字段。 A 表示一个字符,B 表示两个字符,等等。我无法按预期解析它,但幸运的是,使用的正则表达式可以不需要它。因此,该脚本最多支持 999 个显示器,这应该足够了。
一个缺点是,在不同的系统上,由 表示的零长度字符串^@
可能会破坏此脚本。如果有人知道该怎么做更好,请告诉我。
另外,我宁愿检测显示编号而不从 X-cookie 中提取它,因为某些系统上不存在 X-cookie,这使得该脚本不太通用。