CGI программирование с помощью сценариев оболочки - PullRequest
4 голосов
/ 30 июля 2009

Мне нужно передать содержимое текстового поля в переменную. т.е. все, что напечатано в текстовом поле html-страницы, должно быть передано в переменную. Это потому, что я вызываю HTML (также CGI) внутри программирования оболочки linux. Мне нужно манипулировать этой переменной, как я хочу. Есть ли у вас идеи сделать это?

Что мне нужно сделать, так это то, что я хочу получить MAC-адрес в качестве ввода от пользователя. то есть у нас должна быть HTML-страница с текстовым полем, чтобы этот пользователь мог ввести MAC-адрес. поэтому все, что пользователь вводит в текстовое поле, необходимо передать в переменную.

Как только мы получим переменную, этот скрипт автоматически добавит этот MAC-адрес в брандмауэр linux, чтобы запретить доступ.

Код должен быть похож на следующее:

!/bin/bash

echo "Content-type: text/html"

echo ""

echo ""

echo "enter the MAC address "

iptables -A INPUT -m mac --mac-source $mac_address -j DROP

service iptables save

service iptables restart

Я сохраню этот файл (test.cgi) в каталоге / var / www / cgi-bin и запусту этот скрипт из firefox.

Так что проблема теперь у меня есть переменная $mac_address. CGI не передает ввод текстового поля в переменную $ mac_address.

Ответы [ 4 ]

4 голосов
/ 30 июля 2009

Реальный ответ на этот вопрос не .

Ваш веб-сервер работает с привилегиями root. Это первое нет-нет.

Вы действительно хотите, чтобы весь мир мог поработать с вашей конфигурацией брандмауэра? У вас нет контроля над тем, как вызывается ваш сценарий оболочки, что передается ему. Вы открываете основные дыры в безопасности.

См. FAQ по безопасности WWW для сценариев CGI и Написание безопасных сценариев CGI , а также Безопасность CGI: лучше, чем просто сожалеть .

3 голосов
/ 30 июля 2009

Сначала прочитайте CGI-праймер .

Вам понадобится HTML-страница с таким кодом:

<form method="get" action="/cgi-bin/my-fw-script.sh">
    <p>Gimme an IP address: <input name="addr"></p>
    <input type="submit">Block IP</input>
</form>

Когда пользователь нажимает кнопку отправки формы, запускается ваша программа Bash CGI. ( / path / to / cgi-bin / my-fw-script.sh в приведенном выше примере.) Ввод текста будет осуществляться в переменной среды QUERY_STRING в виде variable = value . Для простых входных данных вы можете просто вызвать функцию Bash eval, чтобы превратить ее в переменную Bash:

#!/bin/sh
eval $QUERY_STRING
echo You asked me to block $addr.

Это будет работать только для одного поля ввода и будет прерываться, если есть пробелы или другие специальные символы. Я полагаю, что bash_cgi, который кто-то порекомендовал, позаботится об этих деталях для вас. Делайте это, как в примере выше, только если эта программа останется очень простой.

Кстати, вы почти наверняка не хотите добавлять MAC-адреса в брандмауэр. Это работает только для хостов, которые находятся в той же локальной сети, что и брандмауэр. Пакеты, поступающие из другой локальной сети, Интернета и т. Д., Будут иметь MAC-адрес шлюза локальной сети. Вы, вероятно, должны вместо этого блокировать хосты по IP-адресу.

1 голос
/ 30 июля 2011

Проверьте bashlib - программирование CGI с помощью оболочки bash

bashlib - это скрипт оболочки, который делает программирование CGI в оболочке bash легче или, по крайней мере, более терпимо. Он содержит несколько функций, которые вызываться автоматически и размещать элементы формы (из POST и GET) и куки в вашей среде. Он также содержит полный документация о том, как использовать эти переменные и как установить куки вручную.

Это очень просто использовать и делает передачу строк в качестве переменных и т. Д. Быстрым. Не позволяйте скептикам ненавидеть bash как язык веб-сценариев. Он может держаться самостоятельно ... и он прост, распространен и эффективен ... Это немного идет вразрез с зерном, но если вам нелегко давить на сверстников, я бы сказал, пойти на это.

#!/bin/bash
# this sources bashlib into your current environment
. /usr/local/lib/bashlib
echo "Content-type: text/html"
echo ""
# OK, so we've sent the header... now send some content
echo "<html><title>Crack This Server</title><body>"

Связано и круто: xmlsh и shellinabox .

0 голосов
/ 04 октября 2011

Извините, что продолжаю говорить об этом, я просто думаю это слишком весело ...

Так что для полного универсального сценария CGI, проверьте это ...

предупреждение ... не для фанатов безопасности или тех, кто не совсем знает, что влечет за собой следующее ...

<code>#!/usr/bin/python
# /var/www/cgi-bin/doanything.cgi   r-xr-x---  wwwuser group
# what does this do?  LITERALLY ANYTHING.   Usage: 
# http://server.local/cgi/doanything.cgi?DO="if you can think of how to bash it"; THEN="bash it"; echo $THEN 
# result: bash it


import cgitb; cgitb.enable()
import os, urllib, subprocess as sub

# Retrieve the command from the query string and unencode the escaped %xx chars
str_command = urllib.unquote(os.environ['QUERY_STRING'])
p = sub.Popen(['/bin/bash', '-c', str_command], 
     stdout=sub.PIPE, stderr=sub.STDOUT)
output = urllib.unquote(p.stdout.read())

print """\
Content-Type: text/html\n
<html><body>
<pre>
<!-- UNCOMMENT THE FOLLOWING TO ECHO COMMAND --> 
<!-- $ %s  -->
%s
"" "% (str_command, выходной)
...