Синтаксис:
${parameter:-word}
и специальная форма:
${parameter-word}
является допустимым синтаксисом в POSIX shell, означает использование значения по умолчанию word
, если parameter
не установлен или null.
Обычно, если слово
пустое, то:
${parameter-}
и:
$parameter
или:
${parameter}
эквивалентны.
Но под действием set -u
все незаданные переменные приводят к завершению работы оболочки. ${параметр-}
используется для обхода этого строгого правила. Это работает в обоих случаях, так что да, это более правильный способ.
Мне удалось запустить Xvfb без root.
В конце концов, я загрузил исходный код с https://www.x.org/wiki/Releases/Download/ , внедрил переменные среды, установил зависимости (yum) и скомпилировал ] Xvfb
и перенес эти двоичные и разделяемые библиотеки в мою песочницу.
Важно отметить, что в [sources] /xkb/xkbInit.c
я добавил эти строки вокруг строки 815:
if (++i >= argc)
UseMsg();
else
XkbDfltRepeatInterval = (long) atoi(argv[i]);
return 2;
}
/* End original code */
// Change xkbcomp bin directory with an environment variable
char *xkbBinDir = getenv("XKB_BINDIR");
if (xkbBinDir) {
XkbBinDirectory = Xstrdup(xkbBinDir);
}
// Change base xkb directory with an environment variable
char *xkbBaseDir = getenv("XKBDIR");
if (xkbBaseDir) {
XkbBaseDirectory = Xstrdup(xkbBaseDir);
}
/* Original code */
return 0;
}
Я могу установить переменные среды XKB_BINDIR
в свой xkbcomp
двоичный путь (скопирован в песочницу) и XKBDIR
туда, где находится мой файл default.xkm
.
И снова моей успешной стратегией была компиляция Xvfb
из исходников с изменениями. Для мучительных подробностей и пошаговых инструкций я написал это на своем сайте здесь - https://ericdraken.com/running-xvfb-on-a-shared-host-without-x/
У @dirkt был интересный подход, который заключался в том, чтобы взломать двоичный файл Xvfb и выполнить манипуляции со строками. Это привлекательно, так как это быстро и несколько непослушно, но у него были недостатки: 1) я не могу знать номер сервера заранее [1 .. 99], и 2) Мои пути слишком длинные и потребуют символических ссылок. Я действительно пробовал команду NOP (:) в качестве замены строки вместе с ручным копированием server-N.xkm
, за исключением того, что есть два логических пути, с которыми нужно бороться в источнике код, один из которых, когда файл xkm кэшируется.
Аналогичный подход заключается в использовании Xdummy, если xserver-xorg-video-dummy доступен в вашей изолированной системе. Он использует некоторые фиктивные драйверы и предоставляет X-сервер, который может работать без привилегий root. Вы можете найти некоторые объяснения и образец xorg.conf на веб-сайте xpra: https://xpra.org/trac/wiki/Xdummy . Требуется установить X, но не не нужен работающий X-сервер.
(Извините, у меня недостаточно репутации, чтобы опубликовать это в качестве комментария)
Частичный ответ: Как запустить Xvfb без xkeycomp
.
Согласно вашему описанию, ваша основная проблема заключается не в том, чтобы запустить Xvfb
как без полномочий root (что довольно хорошо работает в моей системе), но как без полномочий root вы не можете установить вспомогательные программы вроде xkeycomp
и связанные с ними файлы данных в том месте, где их ожидает Xvfb
.
Это сложно смоделировать, не зная точно, что установлено, а что нет в вашей изолированной среде CentOS. Но вот как избавиться от зависимости xkeycomp
:
Как показывает использование строк
в Xvfb
, вызов xkeycomp
выглядит например "% s% sxkbcomp" -w% d% s -xkm "% s" -em1% s -emp% s -eml% s "% s% s.xkm"
и соответствующий источник файлы: xkbInit.c и ddxLoad.c . При беглом осмотре кажется, что путь к xkbcomp
зашит. Но строка достаточно длинная, чтобы заменить ее вызовом сценария, что показывает, что Xvfb
хочет скомпилировать следующее описание
xkb_keymap "default" {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compatibility { include "complete" };
xkb_symbols { include "pc+us+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
, полученное из stdin
, в файл /tmp/server-1.xkm
. Итак, на машине с X и инструментами скопируйте это описание в файл, скажем default.xkb
, и скомпилируйте его
xkbcomp -xkm default.xkb
в default.xkm
.Теперь исправьте свою копию Xvfb
в песочнице CentOS, выполнив поиск вызова:
$ grep -FobUa '"%s%sxkbcomp' Xvfb
1648800:"%s%sxkbcomp
и исправив его с помощью вызова cp
:
echo -n '/bin/cp /home/dirk/tmp/xvfb/default.xkm /tmp/server-1.xkm ' | dd bs=1 of=Xvfb seek=1648800 conv=notrunc
(конечно, с вашей позицией и ваш путь к default.xkm
).
Это нормально работает на моей машине, но на вашей изолированной машине CentOS теперь, вероятно, вызовет следующую проблему. : -)
И X API отделяет функции для проверки раскладки клавиатуры от реальных устройств ввода, так что даже если нет устройств ввода, раскладка клавиатуры все равно должна присутствовать.