Совет чайнику — как запустить sh скрипт на сервере через браузер?

Добрый вечер хабражители!

Есть Debian сервер.
На нём лежит sh скрипт, который выводит результаты работы в текстовый файл.
Файл всегда можно посмотреть в браузере, т.к он расшарен с помощью Lighttpd.
Скрипт выполняется через cron каждый час и, соответственно, данные в текстовике всегда чуть устаревшие.

1. Посоветуйте рецепт, чтобы скрипт запускался только при открытии в браузере и выводил актуальные результаты выполнения сразу на страничку. Прогресс бар очень желателен.

2. Насколько это безопасно?

P.S. Осмелюсь предположить, что это делается через cgi скрипты, на дальше моих знаний не хватает. С Web знаком слабо.
  • Вопрос задан
  • 20442 просмотра
Пригласить эксперта
Ответы на вопрос 11
BuriK666
@BuriK666
Компьютерный псих
Запускайте его как cgi
Ответ написан
Комментировать
pomeo
@pomeo
как-то сложные варианты здесь насоветовали. CGI всё правильно, это в ту сторону. Как оно настраивается это придётся прочитать в доках к lighttpd, возможно уже работает.
Кидаете в директорию cgi файл test.cgi с chmod +x
#!/bin/bash
echo "Content-type: text/html" #или text/plain и любое другое
echo ""
echo "<h1>test</h1>"

и открываете в браузере http://site/cgi/test.cgi, если вывелось то всё отлично.
С безопасностью тоже всё прекрасно, не вижу проблем чем shell скрипт отличается от любого другого php, rb, py и т.д.
Ответ написан
Комментировать
no1
@no1
1. это ОЧЕНЬ небезопасно
2. sudo
Ответ написан
Комментировать
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
С безопасностью проблем в целом (если с умом подходить к самому скрипту) проблем нет. Ну и за basic auth лучше убрать.
Теги в гугле — apache bash cgi run.
Ответ написан
Комментировать
Nastradamus
@Nastradamus
Из PHP:

<?php
$e = "/usr/bin/nohup /home/vasya/scripts/run_build.sh > /dev/null 2>&1 &";
shell_exec("$e");
php?>

Ответ написан
miraage
@miraage
Старый прогер
Почти все веб-ЯП имеют функции вроде system(), exec(), которые в свою очередь и так понятно что делают.
Отсюда и пляшите. Я бы запилил аутентификацию перед запуском скрипта.
Ответ написан
Комментировать
NanoDragon
@NanoDragon
Это абсолютно безопасно если нормально сделать.
Можно вместо lighttpd. Запустить ноду. www.nodebeginner.ru/
Или как вариант прикрутить к вебсерверу какой нить скриптовый движок(php).
Ответ написан
Комментировать
@lless
webmin может.
Ответ написан
Комментировать
@Eddy_Em
Я и сам поначалу CGI делал только на баше (но в малой локалке это еще более-менее работало, а потом пришлось все-таки и о безопасности задуматься — CGI стал писать на C).
Вот — простой пример (словарик).
dict.cgi:
#!/bin/sh
addw()
{
    echo "<form  action="/cgi-bin/addaword" method=POST>\
	The translation of  <b><input size=20 name="word" value="\"$word\""></b>  is  <input name="trans" size=50>" 
    echo "<input type=submit value=\"Add the word\"></form>"
}    
ud="../html/Dictionary/userdict.txt"
eval `./convert`

echo -e "Content-type: text/html\n"
cat header.txt
echo "<body>"
if [ "$word" = "" ]; then
    tr="Please, enter a word"
else
    tr=`cat $ud|grep -i " $word "`
    tr1=`cat ../html/Dictionary/Dictionary.txt|grep -i "^$word:"`
    tr2=`cat ../html/Dictionary/Dictionary.txt|grep -i "$word"`
    tr3=`cat ../html/Dictionary/kara4.dic| grep -i "$word"`
fi    

if [ "$pass" = "eddy" ]; then
    tmp="/tmp/dic.cgi.$$"
    cat $ud | grep -v " $word " > $tmp
    rm $ud
    cp $tmp $ud
    rm $tmp
    addw
    exit
fi

if [ "$tr" != "" -o "$tr1" != "" -o "$tr2" != "" -o "$tr3" != "" ]; then
    if [ "$tr1" = "" ]; then 
	if [ "$tr2" = "" ]; then
	    tr1="The word is absent"
	else
	    tr1="$tr2"
	fi
    fi
    if [ "$tr" = "" ]; then tr="The word is absent"; fi
    echo "<div style=\"text-align: center; height: 100%\"><pre>"
    echo "<big><b>Карачаевский:</b></big><hr width=30%>"
    echo "$tr3" | sed "s/$word/<b><font color=red>$word<\/font><\/b>/g"
    echo "<hr size=5px>
<big><b>Английский:</b></big><hr width=30%>"
    echo "$tr1" | sed "s/$word/<b><font color=red>$word<\/font><\/b>/g"
    echo "</pre></div>"
else
    echo "Такого слова я, увы, не знаю..."
fi    

echo "</body>"

И вот такой формочкой этот CGI запускался:
<form name="main" action="/cgi-bin/dict.cgi" method="POST" target="client">
<b>Ваше слово:</b>
<input name="word" size="50">  
<input type=submit size="2" value="Перевести">
</form>
Ответ написан
Комментировать
@Eddy_Em
А еще есть такая штука (правда, не знаю, поддерживают ли ее другие веб-серверы, помимо апача) — SSI. Запускаем на сервере CGI (хоть баш-скрипт, хоть еще что) и подставляем выхлоп в html. Т.к. эта штука работает на стороне сервера (т.е. выполняется до того, как страничка попадает к пользователю), с безопасностью намного выше, чем запуск CGI посредством GET или POST запроса.
Ответ написан
Комментировать
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Вот у меня так динамический генерится список файлов в текущем каталоге в файле index.php, т.к если в каталоге index.php/htm9l) отсутствует, выдается 403.
подорзреваю, что можно выводить всё, что угодно, динамически его выдавая
<?php

$bad_files = array('index.php');

if ($handle = opendir('.')) {
    echo '<table width="2" border="2" cellspacing="2" cellpadding="3">';
    while (false !== ($file = readdir($handle))) {
        if ($file[0] == '.') {
            continue; // skip dot-files
        }
        if (in_array($file, $bad_files)) {
            continue; // skip 'bad' files
        }
        if (is_dir($file)) {
            $file .= '/';
        }
        echo "<tr><td><a href=\"$file\">$file</a></td></tr>";
    }
    echo '</table>';
    closedir($handle);
} else {
    echo 'Error';
}

Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы