счас точно последний вариант с вводом адресов в формате X.X.X.X и X.X.X.0/XX
с простейшей проверкой с помощью ipcalc (и проверяет есть ли он в системе)
если ipcalc есть в системе и введен не валидный адрес, то не фильтрует
если введен X.X.X.X то фильтр вида host X.X.X.X
если введен X.X.X.0/XX то фильтр вида net X.X.X.0/XX
#!/bin/sh
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
[ -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='`
address=`echo ${QUERY_STRING##*tcpdump} | tr '&' '\n' | grep '^address=' | sed 's/\s\+//g; s/,/\./g'`
expression=""
which ipcalc > /dev/null && ipcalc -n "${address##*=}" | grep -q 'INVALID ADDRESS'
if [ $? -eq 0 -o -z "${address##*/}" ]; then
expression=""
else
address="${address##*=}"
[ "${address##*/}" != "${address}" ] && expression="net ${address}" || expression="host ${address}"
echo "expression: ${expression}<br />"
fi
ifconfig -s | grep -q "${iface##*=}" && iface="${ifaces##*=}"
date
echo '<br /><b>iface: '$iface'</b><br />'
sudo timeout -9 3 tcpdump -n -i "$iface" -c 20 $expression | 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"
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+"&address="+document.getElementById("address").value, 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>IP: <input type="text" id="address" /></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
и лавочку закрою )) как схожу за поллитрой