язык BASH для проверки решений
Коллеги! Подскажите, пожалуйста, как подключить язык BASH для проверки решений на этом языке? Последняя версия ejudge установлена на Ubuntu 13.10. Почитал wiki про установку языковых процессоров. Может у кого-то есть уже готовые скрипты?
Re: язык BASH для проверки решений
Попробуйте сделать его, взяв за основу, например, python
Re: язык BASH для проверки решений
Здравствуйте, Александр!
Пока добавить язык bash в систему не удалось.
Вот как я это делал.
1. В директории /ejudge/scripts создал два файла, взяв за основу аналогичные файлы для python:
bash.in
bash-version.in
2. Скопировал эти файлы в директорию /inst-ejudge/libexec/ejudge/lang/in
3. Запустил ejudge-configure-compilers. Настройщик увидел язык bash, написал, что он доступен. При выходе из программы я сохранил новые конфигурационные файлы.
4. В директории judges/compile/conf обновился конфигурационный файл compile.cfg. В нем добавился раздел
[language]
id = 90
short_name = "bash"
long_name = "Bash"
src_sfx = ".sh"
cmd = "bash"
arch = "linux-shared"
5. В директории /judges/compile/conf/lang.d появился файл bash.cfg следующего содержания
version="4.2.45(1)-release"
arg=""
long_name="Bash"
src_sfx=".sh"
arch="linux-shared"
BASHPATH="/bin/bash"
6. В директории judges/compile/scripts появились два файла со скриптами
bash
bash-version
7. В файл lang_ids.cfg из директории inst-ejudge/libexec/ejudge/lang дописал вручную строку
bash=90
8. Остановил и снова запустил ejudge командами
./ejudge-control stop
./ejudge-control start
9. Зашел на сервер через serve-control - но в списке языков Language settings для соревнований язык bash не появился.
10. Попробовал дописать язык вручную в файл serve.cfg конкретного соревнования - все равно языка в списке доступных языков (активных и неактивных) нет.
11. Пробовал создань новый контест, но язык все-равно не появляется.
Наверное, я что-то пропустил.
Пока добавить язык bash в систему не удалось.
Вот как я это делал.
1. В директории /ejudge/scripts создал два файла, взяв за основу аналогичные файлы для python:
bash.in
bash-version.in
2. Скопировал эти файлы в директорию /inst-ejudge/libexec/ejudge/lang/in
3. Запустил ejudge-configure-compilers. Настройщик увидел язык bash, написал, что он доступен. При выходе из программы я сохранил новые конфигурационные файлы.
4. В директории judges/compile/conf обновился конфигурационный файл compile.cfg. В нем добавился раздел
[language]
id = 90
short_name = "bash"
long_name = "Bash"
src_sfx = ".sh"
cmd = "bash"
arch = "linux-shared"
5. В директории /judges/compile/conf/lang.d появился файл bash.cfg следующего содержания
version="4.2.45(1)-release"
arg=""
long_name="Bash"
src_sfx=".sh"
arch="linux-shared"
BASHPATH="/bin/bash"
6. В директории judges/compile/scripts появились два файла со скриптами
bash
bash-version
7. В файл lang_ids.cfg из директории inst-ejudge/libexec/ejudge/lang дописал вручную строку
bash=90
8. Остановил и снова запустил ejudge командами
./ejudge-control stop
./ejudge-control start
9. Зашел на сервер через serve-control - но в списке языков Language settings для соревнований язык bash не появился.
10. Попробовал дописать язык вручную в файл serve.cfg конкретного соревнования - все равно языка в списке доступных языков (активных и неактивных) нет.
11. Пробовал создань новый контест, но язык все-равно не появляется.
Наверное, я что-то пропустил.
Re: язык BASH для проверки решений
Вроде все правильно.
Что выводится, если запустить команду
[cmd]
bash-version -r
[/cmd]
из командной строки?
Что выводится, если запустить команду
[cmd]
bash-version -r
[/cmd]
из командной строки?
Re: язык BASH для проверки решений
Запустил команду
./bash-version -r
ту, которая в директории
judges/compile/scripts
получил вот такой вывод
version="4.2.45(1)-release"
arg=""
long_name="Bash"
src_sfx=".sh"
arch="linux-shared"
BASHPATH="/bin/bash"
./bash-version -r
ту, которая в директории
judges/compile/scripts
получил вот такой вывод
version="4.2.45(1)-release"
arg=""
long_name="Bash"
src_sfx=".sh"
arch="linux-shared"
BASHPATH="/bin/bash"
Re: язык BASH для проверки решений
Если запустить ejudge-configure-compilers, то язык "bash" находится?
Re: язык BASH для проверки решений
Проблему решил, язык BASH теперь работает.
Немного поменял последовательность действий и исправил маленькую ошибку в bash-version скрипте (там в самых последних двух строках исправил ключ -V, который остался от скрипта для python, на ключ --version).
Итак,
1. в директории judges/compile/scripts создаю директорию in
2. в созданной директории judges/compile/scripts/in создаю два файла с соответствующими скриптами
bash.in
bash-version.in
3. из директории inst-ejudge/bin запускаю программу ./ejudge-configure-compilers. Она находит язык, и указывает
в списке доступных языков номер (id) языка bash. В моем случае это 90.
4. в файл inst-ejudge/libexec/ejudge/lang/lang_ids.cfg в конец добавляю строку bash=90.
5. из директории inst-ejudge/bin/ запускаю
./ejudge-control stop
./ejudge-control start
6. Все готово. при запуске serve-control в списке языков в Language settings появился язык Bash.
Все работает, задачи проверяются! Спасибо!
Единственный маленький вопрос. Чтобы задачи проверялись, пришлось поставить в настройках
Run programs securely: NO
Можно ли настроить язык так, чтобы эта настройка была YES. Или для скриптовых языков всегда NO?
Немного поменял последовательность действий и исправил маленькую ошибку в bash-version скрипте (там в самых последних двух строках исправил ключ -V, который остался от скрипта для python, на ключ --version).
Итак,
1. в директории judges/compile/scripts создаю директорию in
2. в созданной директории judges/compile/scripts/in создаю два файла с соответствующими скриптами
bash.in
bash-version.in
3. из директории inst-ejudge/bin запускаю программу ./ejudge-configure-compilers. Она находит язык, и указывает
в списке доступных языков номер (id) языка bash. В моем случае это 90.
4. в файл inst-ejudge/libexec/ejudge/lang/lang_ids.cfg в конец добавляю строку bash=90.
5. из директории inst-ejudge/bin/ запускаю
./ejudge-control stop
./ejudge-control start
6. Все готово. при запуске serve-control в списке языков в Language settings появился язык Bash.
Все работает, задачи проверяются! Спасибо!
Единственный маленький вопрос. Чтобы задачи проверялись, пришлось поставить в настройках
Run programs securely: NO
Можно ли настроить язык так, чтобы эта настройка была YES. Или для скриптовых языков всегда NO?
Re: язык BASH для проверки решений
В безопасном режиме запрещено создание других процессов. Поэтому вряд ли можно заставить bash работать в безопасном режиме.
Если необходимо, можно использовать disable_security
Если необходимо, можно использовать disable_security
Re: язык BASH для проверки решений
Простите за нахальство - не поделитесь конфигурационными файлами?kai977 wrote:Проблему решил, язык BASH теперь работает.
bash.in
Конечно поделюсь!
bash.in
bash.in
Code: Select all
#!/bin/bash
# $Id: bash.in 5550 2009-02-19 18:14:43Z cher $
# Copyright (c) 2003-2008 Alexander Chernov <cher@ejudge.ru>
# This is a `compilation' script for the Bash language.
# The idea is to append "#!${BASHPATH}" string
# to the beginning of the file.
# Usage: bash <input> <output>
# using EJUDGE_FLAGS we may pass additional flags
LANG_CONFIG_DIR="@lang_config_dir@"
[ "${EJUDGE_LANG_CONFIG}" = "" ] && EJUDGE_LANG_CONFIG="${LANG_CONFIG_DIR}/bash.cfg"
if [ -f "${EJUDGE_LANG_CONFIG}" ]
then
. "${EJUDGE_LANG_CONFIG}"
else
version="unknown"
BASHPATH="/bin/bash"
fi
if [ x"${version}" = x ]
then
echo "This language is not supported." >&2
exit 1
fi
echo "#!${BASHPATH} ${EJUDGE_FLAGS}" > $2
echo "# coding: latin1" >> $2
echo >> $2
cat $1 >> $2
chmod +x $2
exit 0
bash-version.in
Code: Select all
#!/bin/bash
# $Id: bash-version.in 5550 2009-02-19 18:14:43Z cher $
# Copyright (c) 2005-2008 Alexander Chernov <cher@ejudge.ru>
LANG_CONFIG_DIR="@lang_config_dir@"
common_config() {
echo 'long_name="Bash"'
echo 'src_sfx=".sh"'
echo 'arch="linux-shared"'
}
failure() {
rm -f conftest*
echo 'version='
echo 'arg="'"${arg}"'"'
common_config
echo 'BASHPATH=/bin/false'
[ "${verbose}" = 1 ] && echo "no" >&2
exit 1
}
unset LANG
unset LC_ALL
unset LC_MESSAGES
unset LANGUAGE
if [ x"$1" = x-v ]
then
verbose=1
shift
fi
# recheck the language
if [ x"$1" = x-r ]
then
arg="$2"
[ x"$2" != x ] && bash="$2"
[ "${bash}" = "" ] && bash="bash"
[ "${verbose}" = 1 ] && echo -n "checking whether Bash is available..." >&2
"${bash}" --version >/dev/null 2>&1 || failure
version=`"${bash}" --version 2>&1 | head -n1 | gawk '{ print $4; }'` || failure
[ "${version}" != "" ] || failure
BASHPATH=`which "${bash}"` || failure
[ "${BASHPATH}" != "" ] || failure
echo "#! ${BASHPATH}" > conftest.sh
echo 'echo "OK"' >> conftest.sh
chmod +x ./conftest.sh || failure
./conftest.sh >/dev/null 2>&1 || failure
rm -f ./conftest*
echo 'version="'"${version}"'"'
echo 'arg="'"${arg}"'"'
common_config
echo 'BASHPATH="'"${BASHPATH}"'"'
[ "${verbose}" = 1 ] && echo "yes, ${BASHPATH}, ${version}" >&2
exit 0
fi
if [ x"$1" = x-l ]
then
echo "Bash interpreter [http://www.bash.org]"
exit 0
fi
[ "${EJUDGE_LANG_CONFIG}" = "" ] && EJUDGE_LANG_CONFIG="${LANG_CONFIG_DIR}/bash.cfg"
if [ -f "${EJUDGE_LANG_CONFIG}" ]
then
. "${EJUDGE_LANG_CONFIG}"
else
BASHPATH="/bin/bash"
fi
if [ x"${BASHPATH}" = x -o x"${BASHPATH}" = x/bin/false ]
then
echo "This language is not supported." >&2
exit 1
fi
if [ x"$1" = x-p ]
then
echo "${BASHPATH}"
exit 0
fi
"${BASHPATH}" -version 2>/dev/null >/dev/null || exit 1
[ x"$1" = x-f ] && echo -n "Bash "
"${BASHPATH}" -version 2>&1 | head -n1 | gawk '{ print $4; }'
язык BASH и безопасность
BASH я в систему добавил, но проблему с безопасностью пока не решил. К сожалению, запискаемый на проверку скрипт может натворить много бед. Есть ли способ ограничить права запускаемого скрипта, чтобы с его помощью
нельзя было что-либо делать в других директориях, кроме той, в которой он запускается?
нельзя было что-либо делать в других директориях, кроме той, в которой он запускается?
Re: bash.in
Большое спасибо! Думаю, будет интересно. Завтра добавлю себе.kai977 wrote:Конечно поделюсь!
Re: язык BASH и безопасность
В голову только одно пока приходит: запустить chroot, а в нём скрипт.kai977 wrote:BASH я в систему добавил, но проблему с безопасностью пока не решил. К сожалению, запискаемый на проверку скрипт может натворить много бед. Есть ли способ ограничить права запускаемого скрипта, чтобы с его помощью
нельзя было что-либо делать в других директориях, кроме той, в которой он запускается?
Надо подумать как.