Я работаю над проектом, который автоматически компилирует, выполняет и проверяет вывод представленных программ на C, C++, Java и Python. Очевидно, что это должно происходить внутри какой-то защищенной среды, поскольку любой код может быть представлен. После попытки создать контейнер самостоятельно с помощью chroot-тюрьмы, что оказалось непрактичным, я обратился к контейнерам.

Теперь, скажем, у меня есть программа на C, которая принимает int i качестве аргумента и возвращает i+1 . Я хочу написать скрипт, который копирует программу на C (скажем, plusone.out) вместе со списком тестовых входных данных (input.txt) в контейнер LxC, выполняет программу внутри контейнера, записывает выходные данные в файл (output.txt) и экспортирует этот файл обратно в хост-систему, чтобы основное приложение (работающее вне контейнера) могло проверить результаты. Там также должны быть некоторые ограничения на ресурсы, но я могу сделать это с помощью встроенной реализации LxC cgroups .

Я знаю, как сделать большинство вещей, описанных выше, но я не могу понять, как копировать файлы с хоста в контейнер или наоборот. Каждый учебник, который я вижу, демонстрирует поведение, запуская ls или echo внутри контейнера, но никогда не импортируя скрипт или программу из хост-системы. Кто-нибудь может мне помочь или, возможно, направить меня к документации, которая может сказать мне, как это сделать?

1 ответ1

0

Это работает на веб-сервере? Если это так, убедитесь, что хост и контейнеры действительно заблокированы. Если он находится на общедоступном веб-сайте, удостоверьтесь вдвойне (похоже, вы знаете, что делаете это, но подумал, что я упомяну это)

Скопируйте двоичный файл непосредственно в файловую систему контейнера

Предполагая, что у вашей программы executor есть права доступа root, попробуйте следующее:

cp test_runner /var/lib/lxc/<container_name>/rootfs/tmp/

Rootfs - это необработанная файловая система для контейнера. Затем вы должны выполнить свой скрипт, выполнив что-то вроде:

lxc-attach -n container -- /tmp/testprogram

Если он не работает от имени пользователя root, попробуйте использовать непривилегированные контейнеры (это может быть лучше с точки зрения безопасности). Затем вы можете скопировать файл напрямую в контейнер, не нуждаясь в корне. Стефан Грабер (Stephane Graber) (один из разработчиков lxc для ubuntu) в своем блоге представил большое вступление: введение в непривилегированные контейнеры LXC

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .