Archive for the ‘Linux&Unix’ Category

小命令收集

星期三, 10月 10th, 2007

linux32 把系统环境模拟成32位系统

 linux64 把系统环境模拟成32位系统

setterm -blank 0 关闭屏幕保护

getconf LONG_BIT 查询机器系统的位数32 or 64

mii-tools 查看网络接口速率

stty size 获取终端窗口的大小

blkid 显示所有分区标卷

linux安全优化

星期三, 10月 10th, 2007

1,禁止普通用户使用su
only the user who belongs to the wheel group permits su command.

add following content in /etc/pam.d/su:

“auth required /lib/security/$ISA/pam_wheel.so use_uid “
2,禁止root远程登录

prohibits root user login from remote..
Describe “PermitRootLogin no” in /etc/ssh/sshd_config.
3,禁止telnet
telnet shoud be prohibited.
Add following description in configuration file: /etc/xinetd.d/telnet :
「disable = yes」.

4,禁止IP转发
IP forwarding function should be disabled.
Add description in configuration file /etc/sysctl.conf:

“net.ipv4.ip_forward = 0. “
5,防范IP Spoofing attack
“IP Spoofing attack” protection should be enabled.
Add description in configuration file /etc/sysctl.conf:
“net.ipv4.conf.all.rp_filter = 1.”

6,禁止ICMP redirection packet
OS should not accept ICMP redirection packet..
Add description in configuration file /etc/sysctl.conf:

“net.ipv4.conf.all.accept_redirects = 0.”

7,禁止relay ICMP redirection packet

OS should not relay ICMP redirection packet..

Add description in configuration file /etc/sysctl.conf:

“net.ipv4.conf.all.send_redirects = 0.”
8,禁止reply to broadcast ICMP packet.

OS should not reply to broadcast ICMP packet.

Add description in configuration file /etc/sysctl.conf:

net.ipv4.icmp_echo_ignore_broadcasts = 1.”
9,禁止时间戳

OS should avoid the time stamp.

Add description in configuration file /etc/sysctl.conf:

net.ipv4.tcp_timestamps = 0.”
10,禁止伪造广播帧

OS should restrain the warning of the replying of the imitation to the broadcast frame.

Add description in configuration file /etc/sysctl.conf:

net.ipv4.icmp_ignore_bogus_error_responses = 1.”

限制用户使用su命令

星期三, 10月 10th, 2007

1.编辑文件/etc/pam.d/su
2.添加或注释行auth            required        pam_wheel.so use_uid
3.将允许使用su命令的用户加入wheel组

转shell版俄罗斯方块

星期六, 10月 6th, 2007

#!/bin/bash
# Tetris Game
# 10.21.2003 xhchen<xhchen@winbond.com.tw>

#颜色定义
cRed=1
cGreen=2
cYellow=3
cBlue=4
cFuchsia=5
cCyan=6
cWhite=7
colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)

#位置和大小
iLeft=3
iTop=2
((iTrayLeft = iLeft + 2))
((iTrayTop = iTop + 1))
((iTrayWidth = 10))
((iTrayHeight = 15))

#颜色设置
cBorder=$cGreen
cScore=$cFuchsia
cScoreValue=$cCyan

#控制信号
#改游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面;
#当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。
sigRotate=25
sigLeft=26
sigRight=27
sigDown=28
sigAllDown=29
sigExit=30

#七中不同的方块的定义
#通过旋转,每种方块的显示的样式可能有几种
box0=(0 0 0 1 1 0 1 1)
box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)
box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)
#所有其中方块的定义都放到box变量中
box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
#各种方块旋转后可能的样式数目
countBox=(1 2 2 2 4 4 4)
#各种方块再box数组中的偏移
offsetBox=(0 1 3 5 7 11 15)

#每提高一个速度级需要积累的分数
iScoreEachLevel=50        #be greater than 7

#运行时数据
sig=0                #接收到的signal
iScore=0        #总分
iLevel=0        #速度级
boxNew=()        #新下落的方块的位置定义
cBoxNew=0        #新下落的方块的颜色
iBoxNewType=0        #新下落的方块的种类
iBoxNewRotate=0        #新下落的方块的旋转角度
boxCur=()        #当前方块的位置定义
cBoxCur=0        #当前方块的颜色
iBoxCurType=0        #当前方块的种类
iBoxCurRotate=0        #当前方块的旋转角度
boxCurX=-1        #当前方块的x坐标位置
boxCurY=-1        #当前方块的y坐标位置
iMap=()                #背景方块图表

#初始化所有背景方块为-1, 表示没有方块
for ((i = 0; i < iTrayHeight * iTrayWidth; i++)); do iMap[$i]=-1; done
#接收输入的进程的主函数
function RunAsKeyReceiver()
{
        local pidDisplayer key aKey sig cESC sTTY

        pidDisplayer=$1
        aKey=(0 0 0)

        cESC=`echo -ne “\33″`
        cSpace=`echo -ne “\40″`

        #保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。
        #如果在read -s时程序被不幸杀掉,可能会导致终端混乱,
        #需要在程序退出时恢复终端属性。
        sTTY=`stty -g`
       
        #捕捉退出信号
        trap “MyExit;” INT TERM
        trap “MyExitNoSub;” $sigExit
       
        #隐藏光标
        echo -ne “\33[?25l"

       
        while (( 1 ))
        do
                #读取输入。注-s不回显,-n读到一个字符立即返回
                read -s -n 1 key
               
                aKey[0]=${aKey[1]}
                aKey[1]=${aKey[2]}
                aKey[2]=$key
                sig=0

                #判断输入了何种键
                if [[ $key == $cESC && ${aKey[1]} == $cESC ]]
                then
                        #ESC键
                        MyExit
                elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == “[" ]]
                then
                        if [[ $key == "A" ]]; then sig=$sigRotate        #<向上键>
                        elif [[ $key == "B" ]]; then sig=$sigDown        #<向下键>
                        elif [[ $key == "D" ]]; then sig=$sigLeft        #<向左键>
                        elif [[ $key == "C" ]]; then sig=$sigRight        #<向右键>
                        fi
                elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate        #W, w
                elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown        #S, s
                elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft        #A, a
                elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight        #D, d
                elif [[ "[$key]” == “[]” ]]; then sig=$sigAllDown        #空格键
                elif [[ $key == "Q" || $key == "q" ]]                        #Q, q
                then
                        MyExit
                fi

                if [[ $sig != 0 ]]
                then
                        #向另一进程发送消息
                        kill -$sig $pidDisplayer
                fi
        done
}

#退出前的恢复
function MyExitNoSub()
{
        local y
       
        #恢复终端属性
        stty $sTTY
        ((y = iTop + iTrayHeight + 4))

        #显示光标
        echo -e “\33[?25h\33[${y};0H"
        exit
}
function MyExit()
{
        #通知显示进程需要退出
        kill -$sigExit $pidDisplayer
       
        MyExitNoSub
}
#处理显示和游戏流程的主函数
function RunAsDisplayer()
{
        local sigThis
        InitDraw

        #挂载各种信号的处理函数
        trap "sig=$sigRotate;" $sigRotate
        trap "sig=$sigLeft;" $sigLeft
        trap "sig=$sigRight;" $sigRight
        trap "sig=$sigDown;" $sigDown
        trap "sig=$sigAllDown;" $sigAllDown
        trap "ShowExit;" $sigExit

        while (( 1 ))
        do
                #根据当前的速度级iLevel不同,设定相应的循环的次数
                for ((i = 0; i < 21 - iLevel; i++))
                do
                        sleep 0.02
                        sigThis=$sig
                        sig=0

                        #根据sig变量判断是否接受到相应的信号
                        if ((sigThis == sigRotate)); then BoxRotate;        #旋转
                        elif ((sigThis == sigLeft)); then BoxLeft;        #左移一列
                        elif ((sigThis == sigRight)); then BoxRight;        #右移一列
                        elif ((sigThis == sigDown)); then BoxDown;        #下落一行
                        elif ((sigThis == sigAllDown)); then BoxAllDown;        #下落到底
                        fi
                done
                #kill -$sigDown $$
                BoxDown        #下落一行
        done
}
#BoxMove(y, x), 测试是否可以把移动中的方块移到(x, y)的位置, 返回0则可以, 1不可以
function BoxMove()
{
        local j i x y xTest yTest
        yTest=$1
        xTest=$2
        for ((j = 0; j < 8; j += 2))
        do
                ((i = j + 1))
                ((y = ${boxCur[$j]} + yTest))
                ((x = ${boxCur[$i]} + xTest))
                if (( y < 0 || y >= iTrayHeight || x < 0 || x >= iTrayWidth))
                then
                        #撞到墙壁了
                        return 1
                fi
                if ((${iMap[y * iTrayWidth + x]} != -1 ))
                then
                        #撞到其他已经存在的方块了
                        return 1
                fi
        done
        return 0;
}
#将当前移动中的方块放到背景方块中去,
#并计算新的分数和速度级。(即一次方块落到底部)
function Box2Map()
{
        local j i x y xp yp line

        #将当前移动中的方块放到背景方块中去
        for ((j = 0; j < 8; j += 2))
        do
                ((i = j + 1))
                ((y = ${boxCur[$j]} + boxCurY))
                ((x = ${boxCur[$i]} + boxCurX))
                ((i = y * iTrayWidth + x))
                iMap[$i]=$cBoxCur
        done
       
        #消去可被消去的行
        line=0
        for ((j = 0; j < iTrayWidth * iTrayHeight; j += iTrayWidth))
        do
                for ((i = j + iTrayWidth - 1; i >= j; i–))
                do
                        if ((${iMap[$i]} == -1)); then break; fi
                done
                if ((i >= j)); then continue; fi
       
                ((line++))       
                for ((i = j - 1; i >= 0; i–))
                do
                        ((x = i + iTrayWidth))
                        iMap[$x]=${iMap[$i]}
                done
                for ((i = 0; i < iTrayWidth; i++))
                do
                        iMap[$i]=-1
                done
        done
       
        if ((line == 0)); then return; fi

        #根据消去的行数line计算分数和速度级
        ((x = iLeft + iTrayWidth * 2 + 7))
        ((y = iTop + 11))
        ((iScore += line * 2 - 1))
        #显示新的分数
        echo -ne “\33[1m\33[3${cScoreValue}m\33[${y};${x}H${iScore}         "
        if ((iScore % iScoreEachLevel < line * 2 - 1))
        then
                if ((iLevel < 20))
                then
                        ((iLevel++))
                        ((y = iTop + 14))
                        #显示新的速度级
                        echo -ne "\33[3${cScoreValue}m\33[${y};${x}H${iLevel}        "
                fi
        fi
        echo -ne "\33[0m"
        #重新显示背景方块
        for ((y = 0; y < iTrayHeight; y++))
        do
                ((yp = y + iTrayTop + 1))
                ((xp = iTrayLeft + 1))
                ((i = y * iTrayWidth))
                echo -ne "\33[${yp};${xp}H"
                for ((x = 0; x < iTrayWidth; x++))
                do
                        ((j = i + x))
                        if ((${iMap[$j]} == -1))
                        then
                                echo -ne “  ”
                        else
                                echo -ne “\33[1m\33[7m\33[3${iMap[$j]}m\33[4${iMap[$j]}m[]\33[0m"
                        fi
                done
        done
}
#下落一行
function BoxDown()
{
        local y s
        ((y = boxCurY + 1))        #新的y坐标
        if BoxMove $y $boxCurX        #测试是否可以下落一行
        then
                s="`DrawCurBox 0`"        #将旧的方块抹去
                ((boxCurY = y))
                s="$s`DrawCurBox 1`"        #显示新的下落后方块
                echo -ne $s
        else
                #走到这儿, 如果不能下落了
                Box2Map                #将当前移动中的方块贴到背景方块中
                RandomBox        #产生新的方块
        fi
}

#左移一列
function BoxLeft()
{
        local x s
        ((x = boxCurX - 1))
        if BoxMove $boxCurY $x
        then
                s=`DrawCurBox 0`
                ((boxCurX = x))
                s=$s`DrawCurBox 1`
                echo -ne $s
        fi
}

#右移一列
function BoxRight()
{
        local x s
        ((x = boxCurX + 1))
        if BoxMove $boxCurY $x
        then
                s=`DrawCurBox 0`
                ((boxCurX = x))
                s=$s`DrawCurBox 1`
                echo -ne $s
        fi
}
#下落到底
function BoxAllDown()
{
        local k j i x y iDown s
        iDown=$iTrayHeight

        #计算一共需要下落多少行
        for ((j = 0; j < 8; j += 2))
        do
                ((i = j + 1))
                ((y = ${boxCur[$j]} + boxCurY))
                ((x = ${boxCur[$i]} + boxCurX))
                for ((k = y + 1; k < iTrayHeight; k++))
                do
                        ((i = k * iTrayWidth + x))
                        if (( ${iMap[$i]} != -1)); then break; fi
                done
                ((k -= y + 1))
                if (( $iDown > $k )); then iDown=$k; fi
        done
       
        s=`DrawCurBox 0`        #将旧的方块抹去
        ((boxCurY += iDown))       
        s=$s`DrawCurBox 1`        #显示新的下落后的方块
        echo -ne $s
        Box2Map                #将当前移动中的方块贴到背景方块中
        RandomBox        #产生新的方块
}
#旋转方块
function BoxRotate()
{
        local iCount iTestRotate boxTest j i s
        iCount=${countBox[$iBoxCurType]}        #当前的方块经旋转可以产生的样式的数目

        #计算旋转后的新的样式
        ((iTestRotate = iBoxCurRotate + 1))
        if ((iTestRotate >= iCount))
        then
                ((iTestRotate = 0))
        fi

        #更新到新的样式, 保存老的样式(但不显示)
        for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
        do
                boxTest[$j]=${boxCur[$j]}
                boxCur[$j]=${box[$i]}
        done

        if BoxMove $boxCurY $boxCurX        #测试旋转后是否有空间放的下
        then
                #抹去旧的方块
                for ((j = 0; j < 8; j++))
                do
                        boxCur[$j]=${boxTest[$j]}
                done
                s=`DrawCurBox 0`

                #画上新的方块
                for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
                do
                        boxCur[$j]=${box[$i]}
                done
                s=$s`DrawCurBox 1`
                echo -ne $s
                iBoxCurRotate=$iTestRotate
        else
                #不能旋转,还是继续使用老的样式
                for ((j = 0; j < 8; j++))
                do
                        boxCur[$j]=${boxTest[$j]}
                done
        fi
}
#DrawCurBox(bDraw), 绘制当前移动中的方块, bDraw为1, 画上, bDraw为0, 抹去方块。
function DrawCurBox()
{
        local i j t bDraw sBox s
        bDraw=$1

        s=”"
        if (( bDraw == 0 ))
        then
                sBox=”\40\40″
        else
                sBox=”[]”
                s=$s”\33[1m\33[7m\33[3${cBoxCur}m\33[4${cBoxCur}m"               
        fi
       
        for ((j = 0; j < 8; j += 2))
        do
                ((i = iTrayTop + 1 + ${boxCur[$j]} + boxCurY))
                ((t = iTrayLeft + 1 + 2 * (boxCurX + ${boxCur[$j + 1]})))
                #\33[y;xH, 光标到(x, y)处
                s=$s"\33[${i};${t}H${sBox}"
        done
        s=$s"\33[0m"
        echo -n $s
}
#更新新的方块
function RandomBox()
{
        local i j t

        #更新当前移动的方块
        iBoxCurType=${iBoxNewType}
        iBoxCurRotate=${iBoxNewRotate}
        cBoxCur=${cBoxNew}
        for ((j = 0; j < ${#boxNew[@]}; j++))
        do
                boxCur[$j]=${boxNew[$j]}
        done
       

        #显示当前移动的方块
        if (( ${#boxCur[@]} == 8 ))
        then
                #计算当前方块该从顶端哪一行”冒”出来
                for ((j = 0, t = 4; j < 8; j += 2))
                do
                        if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
                done
                ((boxCurY = -t))
                for ((j = 1, i = -4, t = 20; j < 8; j += 2))
                do
                        if ((${boxCur[$j]} > i)); then i=${boxCur[$j]}; fi
                        if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
                done
                ((boxCurX = (iTrayWidth - 1 - i - t) / 2))

                #显示当前移动的方块
                echo -ne `DrawCurBox 1`

                #如果方块一出来就没处放,Game over!
                if ! BoxMove $boxCurY $boxCurX
                then
                        kill -$sigExit ${PPID}
                        ShowExit
                fi
        fi
       
       

        #清除右边预显示的方块
        for ((j = 0; j < 4; j++))
        do
                ((i = iTop + 1 + j))
                ((t = iLeft + 2 * iTrayWidth + 7))
                echo -ne “\33[${i};${t}H        "
        done

        #随机产生新的方块
        ((iBoxNewType = RANDOM % ${#offsetBox[@]}))
        ((iBoxNewRotate = RANDOM % ${countBox[$iBoxNewType]}))
        for ((j = 0, i = (${offsetBox[$iBoxNewType]} + $iBoxNewRotate) * 8; j < 8; j++, i++))
        do
                boxNew[$j]=${box[$i]};
        done

        ((cBoxNew = ${colorTable[RANDOM % ${#colorTable[@]}]}))
       
        #显示右边预显示的方块
        echo -ne “\33[1m\33[7m\33[3${cBoxNew}m\33[4${cBoxNew}m"
        for ((j = 0; j < 8; j += 2))
        do
                ((i = iTop + 1 + ${boxNew[$j]}))
                ((t = iLeft + 2 * iTrayWidth + 7 + 2 * ${boxNew[$j + 1]}))
                echo -ne “\33[${i};${t}H[]”
        done
        echo -ne “\33[0m"
}
#初始绘制
function InitDraw()
{
        clear
        RandomBox        #随机产生方块,这时右边预显示窗口中有方快了
        RandomBox        #再随机产生方块,右边预显示窗口中的方块被更新,原先的方块将开始下落
        local i t1 t2 t3

        #显示边框
        echo -ne "\33[1m"
        echo -ne "\33[3${cBorder}m\33[4${cBorder}m"
       
        ((t2 = iLeft + 1))
        ((t3 = iLeft + iTrayWidth * 2 + 3))
        for ((i = 0; i < iTrayHeight; i++))
        do
                ((t1 = i + iTop + 2))
                echo -ne "\33[${t1};${t2}H||"
                echo -ne "\33[${t1};${t3}H||"
        done
       
        ((t2 = iTop + iTrayHeight + 2))
        for ((i = 0; i < iTrayWidth + 2; i++))
        do
                ((t1 = i * 2 + iLeft + 1))
                echo -ne "\33[${iTrayTop};${t1}H=="
                echo -ne "\33[${t2};${t1}H=="
        done
        echo -ne "\33[0m"

       
        #显示"Score"和"Level"字样
        echo -ne "\33[1m"
        ((t1 = iLeft + iTrayWidth * 2 + 7))
        ((t2 = iTop + 10))
        echo -ne "\33[3${cScore}m\33[${t2};${t1}HScore"
        ((t2 = iTop + 11))
        echo -ne "\33[3${cScoreValue}m\33[${t2};${t1}H${iScore}"
        ((t2 = iTop + 13))
        echo -ne "\33[3${cScore}m\33[${t2};${t1}HLevel"
        ((t2 = iTop + 14))
        echo -ne "\33[3${cScoreValue}m\33[${t2};${t1}H${iLevel}"
        echo -ne "\33[0m"
}
#退出时显示GameOVer!
function ShowExit()
{
        local y
        ((y = iTrayHeight + iTrayTop + 3))
        echo -e "\33[${y};0HGameOver!\33[0m"
        exit
}

#游戏主程序在这儿开始.
if [[ $1 != "--show" ]]
then
        bash $0 –show&        #以参数–show将本程序再运行一遍
        RunAsKeyReceiver $!        #以上一行产生的进程的进程号作为参数
        exit
else
        #当发现具有参数–show时,运行显示函数
        RunAsDisplayer       
        exit
fi

转Linux下的shell五子棋小游戏

星期六, 10月 6th, 2007

#!/bin/sh
# Programname: five
# Author: CLD
# 2004.01
#
L()
{
# 屏幕任意位置
  h=$1;l=$2
  echo -n “[$h;$l;H"
}

## 界面颜色控制变量
white_b=""        # 白底黑字
green_b=""        # 绿底黑字(移动棋字亮块)
blue_b=""         # 兰底白字
gray_b=""       # 灰底黑字
gray_w=""       # 灰底白字
black_w=""      # 黑底白字
# 棋盘换色控制变量
brown_b=""        # 桔黄底黑棋
brown_w=""        # 桔黄底白棋
mage_b=""         # 紫底黑棋
mage_w=""         # 紫底白棋
lt_blue_b=""    # 浅兰底黑棋
lt_blue_w=""    # 浅兰底白棋

kkk()
{
# 棋盘
  L 1 22;echo "$gray_b                                  $black_w"
  L 2 22;echo "$gray_b  ┏┯┯┯┯┯┯┯┯┯┯┯┯┯┓  $black_w"
  L 3 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 4 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 5 22;echo "$gray_b  ┠┼┼╋┼┼┼┼┼┼┼╋┼┼┨  $black_w"
  L 6 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 7 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 8 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 9 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 10 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 11 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 12 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 13 22;echo "$gray_b  ┠┼┼╋┼┼┼┼┼┼┼╋┼┼┨  $black_w"
  L 14 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 15 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 16 22;echo "$gray_b  ┗┷┷┷┷┷┷┷┷┷┷┷┷┷┛  $black_w"
  L 17 22;echo "$gray_b                                  $black_w"
}

getchar()
{
  key=`stty -g`
  stty -echo
  stty raw
  dd if=/dev/tty bs=1 count=1 2>/dev/null
  stty -raw
  stty echo
  stty $key
}
        
clear
kkk
  L 5 34;echo " 五 子 棋 "   
  L 10 24;echo "┌────游戏○设定────┐"
  L 11 24;echo "│                          │"
  L 12 24;echo "│  1_白先走  2_黑先走 [ ]  │”
  L 13 24;echo “│                          │”
  L 14 24;echo “└─────────────┘”
  L 12 48;echo -n
goo=`getchar`
case $goo in
  1) go=”白”;ss=0;sss=0;;
  2) go=”黑”;ss=1;sss=1;;
  *) clear;exit;;
esac
  by=0;bs=0;bsy=0;hy=0;hs=0;hsy=0  #初始化输赢局数
tput civis

help()
{
L 16 3;echo “┏━━━━━━━┓”
L 16 57;echo “┏━━━━━━━┓”
L 17 3;echo “┃              ┃”
L 17 57;echo “┃              ┃”
L 18 3;echo “┃              ┃                                    ┃              ┃”
L 19 3;echo “┃ 赢盘数:      ┃┏━━━━━”$gray_b” m—和为贵 “$black_w”━━━━━┓┃ 赢盘数:      ┃”
L 20 3;echo “┃ 输盘数:      ┃┃ 友                          比 ┃┃ 输盘数:      ┃”
L 21 3;echo “┃              ┃┃ 谊   ”$white_b”Press c change color”$black_w”   赛 ┃┃              ┃”
L 22 3;echo “┃              ┃┃ 第                          第 ┃┃              ┃”
L 23 3;echo “┃ 最后成绩:    ┃┃ 一                          二 ┃┃ 最后成绩:    ┃”
L 24 3;echo “┗━━━━━━━┛┗━━━━━━━━━━━━━━━━┛┗━━━━━━━┛”
}

init_(){   # 继续棋局初始化
kkk >abc
a1=2      
a2=38
b1=52
b2=16
write=$green_b$go$black_w
cat abc
L $a1 $a2;echo $write  # 棋子初始位置
ccc=1  #改变颜色次数
color1=`expr substr $gray_b 3 8`;color2=`expr substr $gray_w 3 8` #默认棋子颜色
L 19 13;echo $by;L 19 68;echo $hy
L 20 13;echo $bs;L 20 68;echo $hs
L 23 15;echo $bsy”  ”;L 23 70;echo $hsy”  ”
}
init_
help

## 棋子移动函数
left(){    ##左移
if [ $a2 -eq 24 ];then a2=24;else a2=`expr $a2 - 2`;fi
sort -t”[" -n +1 abc
L $a1 $a2;echo $write
}
right(){   ##右移
if [ $a2 -eq $b1 ];then a2=$b1;else a2=`expr $a2 + 2`;fi
sort -t”[" -n +1 abc
L $a1 $a2;echo $write
}
down(){    ##下移
if [ $a1 -eq $b2 ];then a1=$b2;else a1=`expr $a1 + 1`;fi
sort -t”[" -n +1 abc
L $a1 $a2;echo $write
}
up(){     ##上移
if [ $a1 -eq 2 ];then a1=2;else a1=`expr $a1 - 1`;fi
sort -t”[" -n +1 abc
L $a1 $a2;echo $write
}

sy(){    # 继续棋局输方先走,统计输赢结果
if [ $qs -eq 7 ];then
  go=”黑”      #如果白棋赢则下一盘黑先走
  run=”白”
  bs=`expr $bs + 0`;by=`expr $by + 1`
  bsy=`expr $by - $bs`
  hy=$bs;hs=$by;hsy=`expr $hy - $hs`
else
  go=”白”      #如果黑棋赢则下一盘白先走
  run=”黑”
  hs=`expr $hs + 0`;hy=`expr $hy + 1`
  hsy=`expr $hy - $hs`
  by=$hs;bs=$hy;bsy=`expr $by - $bs`
fi
}

sy1(){      # 显示输赢结果,统计棋局,询问是否继续  
while true;do
   L 19 13;echo $by;L 19 68;echo $hy
   L 20 13;echo $bs;L 20 68;echo $hs
   L 23 15;echo $bsy”  ”;L 23 70;echo $hsy”  ”
   tput bel;tput bel
   L 6 28;echo $white_b”                      “$black_w
   L 7 28;echo $white_b”    “$run$1″!!!     ”$black_w”  ”$black_w
   L 8 28;echo $white_b”   再来一盘否[y|n]?   ”$black_w”  ”$black_w
   L 9 28;echo $white_b”                      “$black_w”  ”$black_w
   L 10 30;echo “                      ”
key=`getchar`
case $key in
  y)
   init_
   count=`expr $count + 1`
   L 23 36;echo “第 $count 局”
   break;;
  n)
   clear;cat abc
   L 7 30;echo $blue_b”                  ”$black_w   
   L 8 30;echo $blue_b”    “!!!再见!!!”    “$black_w”  ”$black_w
   L 9 30;echo $blue_b”                  ”$black_w”  ”$black_w
   L 10 30;echo $blue_b”  ”Author: c1l2d3″  ”$black_w”  ”$black_w
   L 11 30;echo $blue_b”                  ”$black_w”  ”$black_w
   L 12 32;echo $black_w”                  ”$black_w
   tput cnorm
   rm yyy;exit;;
  *);;
esac
done
}

award()  #判断输赢函数
{
cat abc|sed -n 18,”$”p|awk -F”;” ‘{print $1,$2,$4}’|sed ’s/^..//’ \
|awk ‘{print $1,$2,substr($3,2,1)}’ >yyy               # 计算输赢临时文件      
grep “$qs$” yyy|sort -r -n +0 +1|awk ‘$2+=(NR*2)’ \
|uniq -c|awk ‘{print $1}’|grep ‘[5-9]‘ >/dev/null 2>&1
if [ $? -eq 0 ];then sy;sy1 “棋赢啦!   ”;fi            # 横连子>=5        
grep “$qs$” yyy|sort -r -n +1|awk ‘$1+=NR’ \
|uniq -c|awk ‘{print $1}’|grep ‘[5-9]‘ >/dev/null 2>&1
if [ $? -eq 0 ];then sy;sy1 “棋赢啦!   ” ;fi           # 竖连子>=5      
grep “$qs$” yyy|sort -r -n +0 +1|awk ‘$1=$1+$2/2′|sort -r -n \
|awk ‘$2+=(NR*2)’|uniq -c|awk ‘{print $1}’|grep ‘[5-9]‘ >/dev/null 2>&1
if [ $? -eq 0 ];then sy;sy1 “棋赢啦!   ”;fi            # 右斜连子>=5
grep “$qs$” yyy|sort -r -n +0 +1|awk ‘$1=$1-$2/2′|sort -r -n \
|awk ‘$2+=(NR*2)’|uniq -c|awk ‘{print $1}’|grep ‘[5-9]‘ >/dev/null 2>&1
if [ $? -eq 0 ];then sy;sy1 “棋赢啦!   ”;fi            # 左斜连子>=5
}

count=1    #局数
while true
do
  L 1 4;echo $white_b” 【执白方】 “$black_w
  L 4 5;echo $gray_b” a—左移 “$black_w
  L 6 5;echo $gray_b” d—右移 “$black_w
  L 8 5;echo $gray_b” w—上移 “$black_w
  L 10 5;echo $gray_b” s—下移 “$black_w
  L 12 5;echo $gray_b” p—落子 “$black_w
  L 14 5;echo $gray_b” ]—投降 “$black_w
  L 1 62;echo $white_b” 【执黑方】 “$black_w
  L 4 63;echo $gray_b” 4—左移 “$black_w
  L 6 63;echo $gray_b” 6—右移 “$black_w
  L 8 63;echo $gray_b” 8—上移 “$black_w
  L 10 63;echo $gray_b” 5—下移 “$black_w
  L 12 63;echo $gray_b” 9—落子 “$black_w
  L 14 63;echo $gray_b” 0—投降 “$black_w
  L 22 1;echo -n
  L 23 36;echo “第 $count 局”
  cc=`getchar`
case $cc in
  a|4)
   if [ $ss -eq 0 ] && [ "$cc" = "a" ];then left;fi
   if [ $ss -eq 1 ] && [ "$cc" = "4" ];then left;fi;;
  d|6)
   if [ $ss -eq 0 ] && [ "$cc" = "d" ];then right;fi
   if [ $ss -eq 1 ] && [ "$cc" = "6" ];then right;fi;;
  s|5)
   if [ $ss -eq 0 ] && [ "$cc" = "s" ];then down;fi
   if [ $ss -eq 1 ] && [ "$cc" = "5" ];then down;fi;;
  w|8)
   if [ $ss -eq 0 ] && [ "$cc" = "w" ];then up;fi
   if [ $ss -eq 1 ] && [ "$cc" = "8" ];then up;fi;;
  m)
    run=”此局和棋!    “;sy1;;
  p|9)
   if [ $ss -eq 0 ] && [ "$cc" = "p" ];then
    sed -n 18,”$”p abc|grep “\[$a1;$a2" 2>&1  
    if [ $? -eq 0 ];then L 10 32;echo “  此处已有棋…”;tput bel;sleep 1
      write=$green_b白$black_w
      sss=0
    else
       mm=`L $a1 $a2`[$color2●$black_w
      echo $mm>>abc
      write=$green_b黑$black_w
      sss=1
    fi
    sort -t"[" -n +1 abc
    qs=7
    award;tput bel   
   fi
   if [ $ss -eq 1 ] && [ "$cc" = "9" ];then
    sed -n 18,”$”p abc|grep “\[$a1;$a2" 2>&1  
    if [ $? -eq 0 ];then L 10 32;echo “  此处已有棋…”;tput bel;sleep 1
      write=$green_b黑$black_w
      sss=1
    else
       mm=`L $a1 $a2`”[$color1●$black_w"
      echo $mm>>abc
      write=$green_b白$black_w
      sss=0
    fi
    sort -t"[" -n +1 abc
    qs=0
    award;tput bel
   fi
    ss=$sss;;  # 落子方不允许再走,等待对方走棋
  0|])
    if [ "$cc" = "]” ];then go=”白”;run=”白”;bs=`expr $bs + 1`
      by=`expr $by + 0`
      bsy=`expr $by - $bs`
      hy=$bs;hs=$by;hsy=`expr $hy - $hs`
      sss=0
    else go=”黑”;run=”黑”;hs=`expr $hs + 1`;hy=`expr $hy + 0`
      hsy=`expr $hy - $hs`
      by=$hs;bs=$hy;bsy=`expr $by - $bs`
      sss=1
    fi
      ss=$sss  #谁投降谁下一局先走
    sy1 “棋投降啦”;;
  c)
    md=$ccc    # 变换棋盘颜色
     if [ $md -eq 1 ];then
      def1=`expr substr $gray_b 3 8`;def2=`expr substr $gray_w 3 8`
      color1=`expr substr $brown_b 3 6`;color2=`expr substr $brown_w 3 6`
      sed ’s/’$def1′/’$color1′/g’ abc|sed ’s/’$def2′/’$color2′/g’ >abc.tmp
      mv abc.tmp abc
      cat abc
      ccc=`expr $ccc + 1`
     fi    # 桔黄色
     if [ $md -eq 2 ];then
      def1=`expr substr $brown_b 3 6`;def2=`expr substr $brown_w 3 6`
      color1=`expr substr $lt_blue_b 3 8`;color2=`expr substr $lt_blue_w 3 8`
      sed ’s/’$def1′/’$color1′/g’ abc|sed ’s/’$def2′/’$color2′/g’ >abc.tmp
      mv abc.tmp abc
      cat abc
      ccc=`expr $ccc + 1`
     fi    # 浅蓝色
     if [ $md -eq 3 ];then
      def1=`expr substr $lt_blue_b 3 8`;def2=`expr substr $lt_blue_w 3 8`
      color1=`expr substr $mage_b 3 6`;color2=`expr substr $mage_w 3 6`
      sed ’s/’$def1′/’$color1′/g’ abc|sed ’s/’$def2′/’$color2′/g’ >abc.tmp
      mv abc.tmp abc
      cat abc
      ccc=`expr $ccc - 3`
     fi    # 紫色
     if [ $md -eq 0 ];then
      def1=`expr substr $mage_b 3 6`;def2=`expr substr $mage_w 3 6`
      color1=`expr substr $gray_b 3 8`;color2=`expr substr $gray_w 3 8`
      sed ’s/’$def1′/’$color1′/g’ abc|sed ’s/’$def2′/’$color2′/g’ >abc.tmp
      mv abc.tmp abc
      cat abc
      ccc=`expr $ccc + 1`
     fi    # 灰色
     L 2 38;echo $write;;
  esac
done

动态密码修改脚本

星期五, 10月 5th, 2007

#!/bin/sh
#
# Copyright (C), 2007 bug All Rights Reserved
# Title       : Dynamic Change Password
# Author      : BUG
# File        : dch_passwd.sh
# Version     : 1.0.0
# Date        : 2007-07-22
# Email       : efbbb27115@homtail.com
# License     : General Public License (GPL) v2
# Description : Dynamic Change Password
#

chuser=user
srcpw=secret
srcpw1=`date +%Y%m%d`
srcpw2=`date +%u`
dstpw=${srcpw1}${srcpw}${srcpw2}
echo $dstpw | passwd $chuser –stdin > /dev/null 2>&1

根据系统时间修改用户密码

srcpw为用户密码,srcpw1,srcpw2为外界影响因素,这里时时间和星期几

可以使用crond每天或每小时修改一次密码,防止被穷举破解

Linux安全之屏蔽ICMP

星期三, 10月 3rd, 2007

/proc/sys/net/ipv4/icmp_echo_ingnore_all 文件中的0改为1

echo 1 >/proc/sys/net/ipv4/icmp_echo_ingnore_all

EX正则用法收集

星期三, 10月 3rd, 2007

统计每行出现o字符的数量

awk -Fo ‘{num=(NF-1);{if(num>1)print NR,”line:”,num}}’ filename
awk ‘{print NR,gsub(/\o/,”o”)}’ filename

在每行前插入行号
awk ‘{print NR,$0}’ urfile
cat -n urfile

在每行前插入字符
sed ’s/.*/string&/’ urfile
cat text.txt | sed “s/\(^\)/YES\1/g”

根据分割符取值
echo “/:string:$1$$CoERg7ynjYLsj2j4glJ34.”|cut -d’:’ -f2
echo “/:string:$1$$CoERg7ynjYLsj2j4glJ34.”|awk -F: ‘{print $2}’

 除第一行不打印
cut -d’ ‘ -f2-
awk ‘{$1=”";print}’
sed ’s/^[^[:blank:]]*//’

系统优化之磁盘IO

星期日, 09月 30th, 2007

在大型网站上通常Linux系统的IO会占用非常高是因为频繁的读取文件,而每次读取文件都会更新文件的atime,也就是文件的访问时间,执行时间等。为了避免这一情况可以在fstab或mount中加入noatime选项,下列是实际应用。

在fstab中设置:

LABEL=/                 /                       ext3    defaults        1 1

LABEL=/bak              /mnt/bak                ext3    defaults,noatime        1 2

LABEL=/boot1            /boot                   ext3    defaults        1 2

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

LABEL=/home             /home                   ext3    defaults        1 2

proc                    /proc                   proc    defaults        0 0

sysfs                   /sys                    sysfs   defaults        0 0

LABEL=/tmp              /tmp                    ext3    defaults        1 2

LABEL=/usr              /usr                    ext3    defaults        1 2

LABEL=/var              /var                    ext3    defaults        1 2

LABEL=SWAP-sda7         swap                    swap    defaults        0 0

mount时的参数:
mount -o noatime -L /bak /mnt/bak

cut命令介绍

星期五, 09月 28th, 2007

用法:cut -cnum1-num2 filename

说明:显示每行从开头算起 num1 到 num2 的文字。

范例:

shell>> cat example
test2
this is test1
shell>> cut -c0-6 example ## print 开头算起前 6 个字元
test2
this i

cut其实很有用
-c m-n 表示显示每一行的第m个字元到第n个字元。例如:

———file———–
liubi 23 14000
———file———–
# cut -c 3-9,12-20 file
liubi 14000

-f m-n 表示显示第m栏到第n栏(使用tab分隔)。例如:
———file———–
liubi 23 14000
———file———–
# cut -f 1,3 file
liubi 14000
使用|分隔
cut -d’|’ -f2 1.test>2.test
使用:分隔
cut -d’:’ -f2 1.test>2.test