Как запустить Xvfb без root?

Синтаксис:

${parameter:-word}

и специальная форма:

${parameter-word}

является допустимым синтаксисом в POSIX shell, означает использование значения по умолчанию word, если parameter не установлен или null.


Обычно, если слово пустое, то:

${parameter-}

и:

$parameter

или:

${parameter}

эквивалентны.

Но под действием set -u все незаданные переменные приводят к завершению работы оболочки. ${параметр-} используется для обхода этого строгого правила. Это работает в обоих случаях, так что да, это более правильный способ.

5
13.04.2017, 15:36
3 ответа

Мне удалось запустить 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 кэшируется.

2
27.01.2020, 20:40

Аналогичный подход заключается в использовании Xdummy, если xserver-xorg-video-dummy доступен в вашей изолированной системе. Он использует некоторые фиктивные драйверы и предоставляет X-сервер, который может работать без привилегий root. Вы можете найти некоторые объяснения и образец xorg.conf на веб-сайте xpra: https://xpra.org/trac/wiki/Xdummy . Требуется установить X, но не не нужен работающий X-сервер.

(Извините, у меня недостаточно репутации, чтобы опубликовать это в качестве комментария)

1
27.01.2020, 20:40

Частичный ответ: Как запустить 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 отделяет функции для проверки раскладки клавиатуры от реальных устройств ввода, так что даже если нет устройств ввода, раскладка клавиатуры все равно должна присутствовать.

3
27.01.2020, 20:40

Теги

Похожие вопросы