Я работаю над проектом, который автоматически компилирует, выполняет и тестирует вывод отправленных программ на C, C++, Java и Python. Очевидно, что это должно происходить внутри какой-то защищенной среды, поскольку может быть отправлен любой код. После попытки создать контейнер самостоятельно с помощью chroot jail, что в итоге оказалось непрактичным, я обратился к контейнерам.
Теперь, скажем, у меня есть программа на C, которая принимает int i
аргумент as и возвращает его i+1
. Я хочу написать скрипт, который копирует программу на C (скажем, plusone.out
) вместе со списком тестовых входов ( input.txt
) в контейнер LxC, выполняет программу внутри контейнера, записывает выходные данные в файл ( ) и экспортирует этот файл обратно в хост-систему, чтобы основное приложение (которое работает вне контейнера) могло проверить результаты. Также должны быть некоторые ограничения на ресурсы, но я могу сделать это с помощью встроенной реализации output.txt
LxC .cgroups
Я знаю, как делать большую часть из того, что описано выше, но я не могу понять, как копировать файлы с хоста в контейнер или наоборот. Все руководства, которые я вижу, демонстрируют поведение при запуске ls
или echo
внутри контейнера, но никогда не импортируют скрипт или программу из хостовой системы. Может ли кто-нибудь помочь мне или, возможно, направить меня к документации, которая может подсказать, как это сделать?
решение1
Работает ли это на веб-сервере?Если так, убедитесь, что хост и контейнеры действительно заблокированы. Если это на общедоступном веб-сайте, убедитесь в этом еще раз (кажется, вы знаете, как это делать, но я подумал, что стоит упомянуть об этом)
Скопируйте двоичный файл непосредственно в файловую систему контейнера.
Предполагая, что ваша хостовая программа-исполнитель имеет права root, попробуйте следующее:
cp test_runner /var/lib/lxc/<container_name>/rootfs/tmp/
Rootfs — это сырая файловая система для контейнера. Затем вы можете выполнить свой скрипт, сделав что-то вроде:
lxc-attach -n container -- /tmp/testprogram
Если он не запущен от имени root, попробуйте использовать непривилегированные контейнеры.(на самом деле это может быть лучше с точки зрения безопасности). Затем вы можете скопировать файл напрямую в контейнер без необходимости root. Стефан Грабер (один из разработчиков lxc для Ubuntu) написал отличное введение в своем блоге:Введение в непривилегированные контейнеры LXC