Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: "ifconfig" через веб + "Tcpdump" через веб [РЕШЕНО]  (Прочитано 9039 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #30 : 23 Ноября 2010, 12:28:00 »
в Вашем случае скрипт нужно положить в
/usr/lib/cgi-bin/
и запускать
http://xxxx/cgi-bin/tcpdump.sh

http://www.n-d.ru/cgi-bin/tcpdump.sh

точно так же как у Вас теперь
в /etc/apache2/sites-available/default:
NameVirtualHost *:80
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
    AllowOverride All
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    AddHandler cgi-script .sh
    Order allow,deny
    Allow from all
</Directory>

скрипт положен в
/usr/lib/cgi-bin/tcpdump.sh

chown www-data:www-data /usr/lib/cgi-bin/tcpdump.sh
chmod 700 /usr/lib/cgi-bin/tcpdump.sh

www-data -  уточните для себя, этого ли пользователя запускается апач ?
для начала можно дать права 755

да еще - у меня #!/bin/dash - у Вас скорее всего либо #!/bin/sh либо #!/bin/bash

+ ln -s /etc/apache2/sites-available/default /etc/apache2/sites-enabled/default
« Последнее редактирование: 23 Ноября 2010, 12:37:50 от smaharbA »
Я конечно далек от мысли...(с)

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
Re: ifconfig через веб [РЕШЕНО]
« Ответ #31 : 23 Ноября 2010, 12:45:22 »
Цитировать
ln -s /etc/apache2/sites-available/default /etc/apache2/sites-enabled/default
Симлинк у меня по умолчанию.

-Вот как узнать какой юзер запускает апатч.. тяжеловато.

-Положил скрипт в /usr/lib/cgi-bin/

root@gate:/etc/apache2# ls -l /usr/lib/cgi-bin/
итого 28
..
..
-rwxrwxr-x 1 www-data www-data 1579 2010-11-23 10:04 tcpdump.sh

Но теперь при обращении к http://xxxx/cgi-bin/tcpdump.sh - просто пустая страничка. Которая даже в исходном коде ничего не содержит... и где грабли? )




Пользователь решил продолжить мысль 23 Ноября 2010, 12:49:15:
И кстати у меня :


root@gate:/etc/apache2# cat /etc/apache2/sites-available/default
#NameVirtualHost *:80
Servername localhost
<VirtualHost *:80>

...
...
...

</VirtualHost>
« Последнее редактирование: 23 Ноября 2010, 12:49:15 от TrEK »

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #32 : 23 Ноября 2010, 12:58:22 »
по аджаксу - придется еще немного бороться с кешем либо на стороне сервера, либо в самом джабе-скрипт
к примеру так

http.open("GET", "'$SCRIPT_NAME'?tcpdump", true);
http.setRequestHeader("If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 GMT");


сделайте пока простейший скрипт, дайте ему права на запуск и проверьте что выдает через веб
env.sh
#!/bin/sh
echo 'Content-Type: text/html'
echo

/usr/bin/env


первую ссылку http://www.n-d.ru/images/tcpdump.sh пока прикрыл
вторую пока оставил

да еще - | tidy -asxhtml -utf8 -b -wrap 0 можно убрать вообще, это для проформы сделано, что бы все поближе к стандартам было

результирующий скрипт немного изменил
#!/bin/sh

PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin

echo 'Cache-Control: no-cache'
echo 'Content-Type: text/html'
echo 'Pragma: no-cache'
echo

if [ "${QUERY_STRING%%&*}" = "tcpdump" ]; then
    date
    echo '<br />'
    sudo tcpdump -i eth1 -c 20 | sed 's/$/<br \/>/g'
    exit 0
fi

[ -z "$BASH_SOURCE" ] && BASH_SOURCE=`(echo ${BASH_SOURCE:?}) 2>&1 | cut -d: -f1`
SCRIPT_PATH=${BASH_SOURCE%/*}
SCRIPT_PATH=`cd "$SCRIPT_PATH"&& pwd`
SCRIPT_NAME=${BASH_SOURCE##*/}

[ ! -d "/tmp/$SCRIPT_NAME" ] && mkdir -p "/tmp/$SCRIPT_NAME"
echo `date`': HTTP_X_FORWARDED_FOR='$HTTP_X_FORWARDED_FOR'; REMOTE_ADDR='$REMOTE_ADDR >> "/tmp/$SCRIPT_NAME/$SCRIPT_NAME.txt"

echo '
<html>
<head>
<meta http-equiv="Content-Language" content="ru" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="-1">
<meta http-equiv="Cache-control" content="no-store, no-cache, must-revalidate">
<title>tcpdump</title>
<script type = "text/javascript">
var http;
var timer=0;
if (window.ActiveXObject) {
    try {
        http = new ActiveXObject("Msxml2.XMLHTTP");
        }
    catch (e){
        http = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
else if (window.XMLHttpRequest) {
    http = new XMLHttpRequest();
    }

function show() {
    window.clearTimeout(timer);
    if (!http) return;
    http.open("GET", "'$SCRIPT_NAME'?tcpdump", true);
    http.setRequestHeader("If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 GMT");
    http.onreadystatechange = function() {
        if (http.readyState == 4) {
            document.getElementById("data").innerHTML = http.responseText;
            timer=window.setTimeout("show()",500);
            }
        }
    http.send(null);
    }
</script>
</head>
<body onload="javascript: show()">
<p>HTTP_X_FORWARDED_FOR='$HTTP_X_FORWARDED_FOR'; REMOTE_ADDR='$REMOTE_ADDR'</p>
<div id = "data"></div>
</body>
</html>
' | tidy -asxhtml -utf8 -b -wrap 0
« Последнее редактирование: 23 Ноября 2010, 13:08:33 от smaharbA »
Я конечно далек от мысли...(с)

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
Re: ifconfig через веб [РЕШЕНО]
« Ответ #33 : 23 Ноября 2010, 14:09:57 »
Цитировать
сделайте пока простейший скрипт, дайте ему права на запуск и проверьте что выдает через веб
env.sh
Ну этот выдает....
GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT_CHARSET=windows-1251,utf-8;q=0.7,*;q=0.7 REMOTE_ADDR=80.243.144.18 QUERY_STRING= REMOTE_PORT=49426
DOCUMENT_ROOT=/var/www/ HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 6.1; uk; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 SERVER_SIGNATURE=


... и еще кучу всего.

А ни первый ни результирующий скрипт не выдает никакой информации...
« Последнее редактирование: 23 Ноября 2010, 14:13:48 от TrEK »

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #34 : 23 Ноября 2010, 14:16:15 »
А tidy установлен?

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #35 : 23 Ноября 2010, 14:16:57 »
еще упростим (без получения пути и  имени скрипта ибо проверено не на всех вариантах шелов) и без tidy
#!/bin/sh

PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
echo 'Cache-Control: no-cache'
echo 'Content-Type: text/html'
echo 'Pragma: no-cache'
echo

if [ "${QUERY_STRING%%&*}" = "tcpdump" ]; then
    date
    echo '<br />'
    sudo tcpdump -i eth1 -c 20 | sed 's/$/<br \/>/g'
    exit 0
fi

echo '
<html>
<head>
<meta http-equiv="Content-Language" content="ru" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="-1">
<meta http-equiv="Cache-control" content="no-store, no-cache, must-revalidate">
<title>tcpdump</title>
<script type = "text/javascript">
var http;
var timer=0;
if (window.ActiveXObject) {
    try {
        http = new ActiveXObject("Msxml2.XMLHTTP");
        }
    catch (e){
        http = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
else if (window.XMLHttpRequest) {
    http = new XMLHttpRequest();
    }

function show() {
    window.clearTimeout(timer);
    if (!http) return;
    http.open("GET", "/cgi-bin/tcpdump.sh?tcpdump", true);
    http.setRequestHeader("If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 GMT");
    http.onreadystatechange = function() {
        if (http.readyState == 4) {
            document.getElementById("data").innerHTML = http.responseText;
            timer=window.setTimeout("show()",500);
            }
        }
    http.send(null);
    }
</script>
</head>
<body onload="javascript: show()">
<p>HTTP_X_FORWARDED_FOR='$HTTP_X_FORWARDED_FOR'; REMOTE_ADDR='$REMOTE_ADDR'</p>
<div id = "data"></div>
</body>
</html>
'

а просто в консоли что выдает ?

tcpdump -i eth1 ... - заменить на нужный интерфейс (можно и передачей параметров через веб, но пока жестко прописать)
« Последнее редактирование: 23 Ноября 2010, 14:19:22 от smaharbA »
Я конечно далек от мысли...(с)

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #36 : 23 Ноября 2010, 14:17:48 »
Ошибки скрипта ясен пень все в stderr идут, а апач скорее всего в веб браузер выдаёт только stdout. Чтоб их было видно в stdout можно добавить команду exec 2>&1 в начало скрипта.

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
Re: ifconfig через веб [РЕШЕНО]
« Ответ #37 : 23 Ноября 2010, 14:20:43 »
Цитировать
Цитата
А tidy установлен?
Цитировать
а просто в консоли что выдает ?

(Нажмите, чтобы показать/скрыть)

Простите , сразу не заметил...



Пользователь решил продолжить мысль 23 Ноября 2010, 14:27:50:
Есть, установил tidy  - всё заработало...

вот почему-то консоль выдает что тсдамп не запущен:
root@gate:/usr/lib/cgi-bin# ps ax | grep tcpdump
26339 pts/1    S+     0:00 grep --color=auto tcpdump

Хотя скрипт запущен в двух окнах...


Пользователь решил продолжить мысль 23 Ноября 2010, 14:30:46:
smaharbA, подскажите какой скрипт тогда использовать, тот что второй-измененный?



root@gate:/usr/lib/cgi-bin# ps ax | grep tcpdump
29937 ?        S      0:00 /bin/sh /usr/lib/cgi-bin/test1.sh tcpdump
29939 ?        D      0:00 tcpdump -n -i eth1 -c 20
29942 pts/1    S+     0:00 grep --color=auto tcpdump


« Последнее редактирование: 23 Ноября 2010, 14:37:06 от TrEK »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #38 : 23 Ноября 2010, 14:43:25 »
А так ?
ps -ef | grep tcpdump

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #39 : 23 Ноября 2010, 14:52:00 »
Да не будет tcpdump там вечно торчать, он при запросе запускается, сниффает 20 пакетов, отдаёт их браузеру и завершается..

Пользователь решил продолжить мысль 23 Ноября 2010, 14:53:32:
Для такой задачи очень хорошо бы подошел какой-нибудь кольцевой (round-robin) буффер, читающий из пайпа или сокета и отдающий содержимое через сокет. Может кто видел подобное?
« Последнее редактирование: 23 Ноября 2010, 14:53:32 от Mam(O)n »

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
Re: ifconfig через веб [РЕШЕНО]
« Ответ #40 : 23 Ноября 2010, 15:54:56 »
smaharbA, я вижу Вы уже по интерфейсам сделали? Круть.
Вопрос: а реализацию ввода айпи-адресса который надо просниферить через веб легко сделать?...
Чтоб не конфиг править.. а задавать через страничку ip.

Цитировать
А так ?
ps -ef | grep tcpdump
(Нажмите, чтобы показать/скрыть)

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #41 : 23 Ноября 2010, 16:07:15 »
не заморачивался, просто спросил про системные утилиты и аджакс
а это близко для меня (к тому же плохо отношусь к пыхыпы :) )

+ предпочитаю максимально реализовывать все на  dash (не bash и sh - потому, что - что работает на даше точно будет работать на баше)

+ по интерфейсам с ключом -с есть проблема надо завершать по таймауту, либо все выводить в пайпу, а уж из пайпы забирать порциями
« Последнее редактирование: 23 Ноября 2010, 16:12:56 от smaharbA »
Я конечно далек от мысли...(с)

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
Re: ifconfig через веб [РЕШЕНО]
« Ответ #42 : 23 Ноября 2010, 17:34:09 »
Простите, про пайпу не понял.
Я думал , что после вывода тспдампом инфы... процес завершается.. а у меня дальше висят процессы :) Какбы еще их убивать автоматически?.. или хотябы сразу проверку делало... есть ли процессы в системы тспдампа? Щас попробую подправить..

Я вижу Вы уже там статистику айпишек делали в скрипте? :)

Пользователь решил продолжить мысль 23 Ноября 2010, 17:35:23:
Про dash первый раз узнал :)
А чего к ПХП плохое отношение?... тоже ж ведь удобно много вещей реализировать? Или в Даш ничем не хуже?

Пользователь решил продолжить мысль 23 Ноября 2010, 17:51:24:
22608 ? S 0:00 /bin/sh /usr/lib/cgi-bin/tcpdump1.sh tcpdump 22610 ? S 0:00 tcpdump -i eth0 -c 20 host 192.168.180.36 22616 ? S 0:00 /bin/sh /usr/lib/cgi-bin/tcpdump1.sh 22621 ? S 0:00 /bin/sh /usr/lib/cgi-bin/tcpdump1.sh 22623 ? S 0:00 grep tcpdump
Как надо правильно написать echo `ps ax | grep tcpdump` чтоб оно не кидало все строки в одну.. а правильно форматировало? Чтоб после вывода первой строчки, был перевод на следующую... <br> там не удалось вставить :)
« Последнее редактирование: 23 Ноября 2010, 17:53:47 от TrEK »

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
Re: ifconfig через веб [РЕШЕНО]
« Ответ #43 : 23 Ноября 2010, 18:00:26 »
на пхп сложно сделать код проходящий проверки валидатора
но даже наверное больше както чисто субъективно не нравится и все

а многое реально можно сделать в шеловских скриптах

по завершению тспдампа можно так примерно
sudo timeout -9 3 tcpdump -i "$iface" -c 20 | sed 's/$/<br \/>/g'
но нужен timeout и прописать его придется в судоерс для ввв-дата (можно и без этого наверное, но лениво)
(последний вариант, прикрою лавочку через часок)
#!/bin/sh

PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin

### Такое "сложное" определение пути и имени скрипта для обработки разными шелами dash, sh, bash (вставляю всюду на всякий случай)
### и при разных способах вызова, как есть, через точку, по относительному пути, при наличии в PATH и при вызове "eval . xxx"
[ -z "$BASH_SOURCE" ] && BASH_SOURCE=`(echo ${BASH_SOURCE:?}) 2>&1 | cut -d: -f1`
SCRIPT_PATH=${BASH_SOURCE%/*}
SCRIPT_PATH=`cd "$SCRIPT_PATH"&& pwd`
SCRIPT_NAME=${BASH_SOURCE##*/}

echo 'Cache-Control: no-cache'
echo 'Content-Type: text/html'
echo 'Pragma: no-cache'
echo

#exec 2>&1
if [ "${QUERY_STRING%%&*}" = "tcpdump" ]; then
    iface=eth1
    ifaces=`echo ${QUERY_STRING##*tcpdump} | tr '&' '\n' | grep '^iface='`
    ifconfig -s | grep -q "${iface##*=}" && iface=${ifaces##*=}
    date
    echo '<br /><b>iface: '$iface'</b><br />'
    sudo timeout -9 3 tcpdump -i "$iface" -c 20 | sed 's/$/<br \/>/g'
#    echo '<table border=1>'
#    awk -F'REMOTE_ADDR=\|HTTP_X_FORWARDED_FOR=' '{ print "<tr><td>"$3"</td><td>"$2"</td></tr>" }' "/tmp/$SCRIPT_NAME/$SCRIPT_NAME.txt" | sort -u | tr -d ';'
#    echo '</table>'
    exit 0
fi


[ ! -d "/tmp/$SCRIPT_NAME" ] && mkdir -p "/tmp/$SCRIPT_NAME"
echo `date`': HTTP_X_FORWARDED_FOR='$HTTP_X_FORWARDED_FOR'; REMOTE_ADDR='$REMOTE_ADDR >> "/tmp/$SCRIPT_NAME/$SCRIPT_NAME.txt"
# env >> "/tmp/$SCRIPT_NAME/$SCRIPT_NAME.txt"

echo '
<html>
<head>
<meta http-equiv="Content-Language" content="ru" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="-1">
<meta http-equiv="Cache-control" content="no-store, no-cache, must-revalidate">
<title>tcpdump</title>
<script type = "text/javascript">
var http;
var timer=0;
if (window.ActiveXObject) {
    try {
        http = new ActiveXObject("Msxml2.XMLHTTP");
        }
    catch (e){
        http = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
else if (window.XMLHttpRequest) {
    http = new XMLHttpRequest();
    }

var iface="eth1";

function show() {
    window.clearTimeout(timer);
    if (!http) return;
    ifaces=document.getElementsByTagName("input");
    for (var i=0; i < ifaces.length; i++) {
        if ((ifaces.item(i).name=="iface") && (ifaces.item(i).checked)) {
            if ( iface != ifaces.item(i).value ) http.abort();
            iface=ifaces.item(i).value;
            }
        }

    http.open("GET", "'${SCRIPT_URL}'?tcpdump&iface="+iface, true);
    http.setRequestHeader("If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 GMT");
    http.onreadystatechange = function() {
        if (http.readyState == 4) {
            document.getElementById("data").innerHTML = http.responseText;
            timer=window.setTimeout("show()",500);
            }
        }
    http.send(null);
    }
</script>
</head>
<body onload="javascript: show()">
<p>'`ifconfig -s | cut -d' ' -f1 | tail -n +2 | sed 's/^\(.*\)/<input type="radio" name="iface" value="\\1" onclick="javascript:show()" \/>\\1/g'`'</p>
<p>HTTP_X_FORWARDED_FOR='$HTTP_X_FORWARDED_FOR'; REMOTE_ADDR='$REMOTE_ADDR'</p>
<div id = "data"></div>
</body>
</html>
' | tidy -asxhtml -utf8 -b -wrap 0
Я конечно далек от мысли...(с)

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
Re: ifconfig через веб [РЕШЕНО]
« Ответ #44 : 23 Ноября 2010, 18:06:23 »
Мдя... имея малейшие понятия в программировании сразу тяжело разобраться в скрипте, а в некоторых местах вообще невозможно...
Спасибо что помогли с моим вопросом... так как я уже очень долго искал варианты решения.. А такое решения прямо в точку...
Одна закавыка, чтоб еще и передавать ip-адрес в тспдамп.

Пользователь решил продолжить мысль 23 Ноября 2010, 18:13:14:
Цитировать
но нужен timeout и прописать его придется в судоерс для ввв-дата (можно и без этого наверное, но лениво)
Без этого вижу не работает... а как это сделать , подскажите будьте любезны...

Пользователь решил продолжить мысль 23 Ноября 2010, 18:23:56:
===========

Так, ну как сделать чтоб не выводило всё в кучу я уже разобрался.. надо дописывать к комнаде | sed 's/$/<br />/g'.


Пользователь решил продолжить мысль 23 Ноября 2010, 19:01:26:

==============
Тайм-аут правильно будет так выставлен?
Defaults        env_reset,timestamp_timeout=9

« Последнее редактирование: 23 Ноября 2010, 19:01:40 от TrEK »

 

Страница сгенерирована за 0.02 секунд. Запросов: 21.