北肙

当你不能够再拥有,唯一可以做的,就是令自己不要忘记。

HP小型机自动telnet巡检脚本v2.0

一、概述 为了实现上班偷懒以及被老板最小化利益压榨,为了在闲着的时候还能心安理得地拿工钱,耗时数天凑出一套自动telnet到主机并将巡检结果回传,整理后生成PDF文档的脚本。 二、脚本用途 1、 将主机密码和用户名放在脚本,实现自动telnet到主机。(脚本完成后可用软件加密,免除密码被闲杂人员看到的风险) 2、 可执行命令用变量来存储,可随意增删巡检内容。(至于PDF报告,则需要另外筛选、重新整理。) 3、 既然是自动,除了自动执行外,还可滤掉正确的项,只留下错误日志,让结果一目了然。 4、 生成PDF报告,可直接邮件BOSS,省事又方便。(这才是最重要的) 三、脚本结构 1、 auto_check.sh 遍历主机,调用各种脚本命令。 2、 host.exp 执行expect命令,简单来说,使远程命令在本地执行。 3、 console.exp 同host.exp功能相似,自动敲入回车等,只不过对象是小机MP卡。 4、 其它。过程中提取某一功能单独来写,凑字数。 四、小记 大功告成,哇哈哈,这下可以一门心思修电脑了。(此处应该有掌声) 总觉时间漫长,生亦何欢,死亦何哀,不管人生意义何在,坐吃等死绝不是最合理的一条路。多走走,多看看,不一定通达,但鼠目寸光一定会自取灭亡。 这个周末,好多个时间,只出去吃了两顿饭,总共睡了八九个小时,一直是眼睛盯着字母,心里走着循环,吃饭的时候都在想着这个点这么写会不会更好。总之一句话,水平有限,勉强为之累死人。不知道这两天给百度又添了多少搜索量。 电脑从一开始就循环着“爱是你我”、“西海情歌”,还特意外接了小音响,大晚上不知道从外面能不能听得到,此处按住不提。还别说,伴着女高音和刀哥沧桑的调子,思路不知道有多顺畅。当然,还有蹩脚的英文提示,和针对性不太强的变量以及用得不太熟的awk/sed命令和shell数组,就按各自理解,且学且用吧。 五、BUG 1、生成的PDF文件,有部分内容并未按照即定位置显示; 2、关于vmstat的结果,并未体现在PDF报告中; 3、代码冗长重复; 4、部分巡检功能未涉及。 附上脚本代码,涉及到隐私的,会用多个*代替。 Bash 1、auto_check.sh #! /bin/bash # auto_check.sh # Create by Kitaluft 8-2-14 # Copyright (c) 2014 Kitaluft. All right reserved. HOST=host USER=user […]

一、概述
为了实现上班偷懒以及被老板最小化利益压榨,为了在闲着的时候还能心安理得地拿工钱,耗时数天凑出一套自动telnet到主机并将巡检结果回传,整理后生成PDF文档的脚本。

二、脚本用途
1、 将主机密码和用户名放在脚本,实现自动telnet到主机。(脚本完成后可用软件加密,免除密码被闲杂人员看到的风险)
2、 可执行命令用变量来存储,可随意增删巡检内容。(至于PDF报告,则需要另外筛选、重新整理。)
3、 既然是自动,除了自动执行外,还可滤掉正确的项,只留下错误日志,让结果一目了然。
4、 生成PDF报告,可直接邮件BOSS,省事又方便。(这才是最重要的)

三、脚本结构
1、 auto_check.sh
遍历主机,调用各种脚本命令。
2、 host.exp
执行expect命令,简单来说,使远程命令在本地执行。
3、 console.exp
同host.exp功能相似,自动敲入回车等,只不过对象是小机MP卡。
4、 其它。过程中提取某一功能单独来写,凑字数。

四、小记
大功告成,哇哈哈,这下可以一门心思修电脑了。(此处应该有掌声)
总觉时间漫长,生亦何欢,死亦何哀,不管人生意义何在,坐吃等死绝不是最合理的一条路。多走走,多看看,不一定通达,但鼠目寸光一定会自取灭亡。
这个周末,好多个时间,只出去吃了两顿饭,总共睡了八九个小时,一直是眼睛盯着字母,心里走着循环,吃饭的时候都在想着这个点这么写会不会更好。总之一句话,水平有限,勉强为之累死人。不知道这两天给百度又添了多少搜索量。
电脑从一开始就循环着“爱是你我”、“西海情歌”,还特意外接了小音响,大晚上不知道从外面能不能听得到,此处按住不提。还别说,伴着女高音和刀哥沧桑的调子,思路不知道有多顺畅。当然,还有蹩脚的英文提示,和针对性不太强的变量以及用得不太熟的awk/sed命令和shell数组,就按各自理解,且学且用吧。

五、BUG
1、生成的PDF文件,有部分内容并未按照即定位置显示;
2、关于vmstat的结果,并未体现在PDF报告中;
3、代码冗长重复;
4、部分巡检功能未涉及。
附上脚本代码,涉及到隐私的,会用多个*代替。

Bash

1、auto_check.sh
#! /bin/bash
# auto_check.sh
# Create by Kitaluft 8-2-14
# Copyright (c) 2014 Kitaluft. All right reserved.
HOST=host
USER=user
PASSWD=passwd
[ -e ./host.log ] && rm -rf ./host.log
rm -rf *.log
SAR="echo 'SAR BEGIN'
for I in u d w
do
sar -\$I 1 | grep -e usr -e busy -e swpin
sar -\$I 2 2 | grep -i average | sort -rk 3 | head -1
done
echo 'SAR END'"
VMSTAT="echo 'VMSTAT BEGIN'
vmstat | head -2; vmstat 2 2 | tail -1
echo 'VMSTAT END'"
IOSCAN="echo 'HW BEGIN'
ioscan -fn | grep -i -e \"no_hw\" -e error -e \\
unknown -e unclaimed || echo \"All Hardware OK.\"
echo 'HW END'"
VG="echo 'VG BEGIN'
vgdisplay -v | grep -i -e unavailable -e stale || echo \"All VGs OK\"
echo 'VG END'"
BDF="echo 'FS BEGIN'
bdf | sed -n '/[8,9][0-9]%/p' || echo \"All file system OK\"
echo 'FS END'"
LOG="echo 'LOG BEGIN'
for I in /var/adm/syslog/syslog.log /etc/rc.log /etc/shutdownlog
do
cat \$I | grep -E \"`date +'%b %d'`.*`date +%Y`\" \\
| grep -i -e error -e warning -e mistake -e \\
notice -e \"timed out\" -e \"scsi reset\" -e \"file system full\" -e fail \\
-e notification -e instance -e offline || echo \"\$I OK\"
done
echo 'LOG END'"
DMESG="echo 'DMESG BEGIN'
dmesg | grep -i -e error -e warning -e mistake \\
-e notice -e \"timed out\" || echo \"Dmesg OK.\"
echo 'DMESG END'"
for I in 1 2 3 4 5 6
do
    HOST=1.1.1.$I
    USER=root
    PASSWD="passwd"
    case $I in
        3)
            USER="user"
            PASSWD="password"
            ;;
        18)
            PASSWD="123456"
            ;;
        20)
            PASSWD="abcdef"
            ;;
    esac
    echo "Auto check $HOST@$USER, Please waiting..." | tee -a ./host.log
    ./host.exp $HOST $USER $PASSWD "$SAR" "$VMSTAT" "$IOSCAN" \
        "$VG" "$BDF" "$LOG" "$DMESG" | sed -e '/spawn telnet/,/]#\|QUIT...........0/d' \
        -e '/logout\|Connection closed by foreign host.\|exit/d' \
        -e 's/.*]$ //g' -e '/.*]#\|echo\|There are running jobs./d' \
        -e '/for I\|> do/,/done/d' -e '/ioscan\|vmstat\|dmesg/d' \
        | tee ./host.log
    for I in SAR VMSTAT HW VG FS LOG DMESG
    do
        sed -n '/'$I' BEGIN/,/'$I' END/p' ./host.log \
            | sed -e 's/Average/'$HOST'/g' \
            -e 's/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/host/g' >> "$I".log
    done
done
for I in 1 2 3 4 5
do
    HOST="2.2.2.$I"
    echo "Auto check $HOST's MP, please waiting..." | tee -a ./host.log
    ./console.exp $HOST | sed -n '/Switching to \
        alert level 3 filter.\|Alert threshold level 3 \
        filter will be applied./,/MP MAIN MENU/p' | sed '/MP:/d' \
    | tee -a ./host.log
#   | grep -E -e `date +"%d %b %Y"` -e `date +%m/%d/%Y`
#   tee -a ./console.tmp
done
unset HOST USER PASSWD SAR VMSTAT IOSCAN VG BDF LOG DMESG
COL=7
ROW=0
FILE=( SAR.log SAR.log SAR.log $10 )
KEY=( usr swpin device $11 )
NUM=( 1 1 1 $12 )
TAB_COUNT=( l l l l )
COUNT=9
for((I=0;I<"$(($COUNT/3))";I++))
do
    HEAD[I]=`sed -n '/'${KEY[I]}'/p' ${FILE[I]} | head -1 | sed 's/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/host/'`
    TABLE[I]=`sed -n '/'${KEY[I]}'/,+'${NUM[I]}'{//b; p}' ${FILE[I]}`
    echo "${HEAD[I]}
    ${TABLE[I]}" > tmp
    ROW=`echo "${HEAD[I]}" | awk '{print NF}'`
    TAB_COUNT[I]=`for((i=0;i<="$ROW";i++))
    do
        if [ $i -ne $ROW ];then
            echo -n "|l"
        else
            echo -n "|"
        fi
    done`
    TAB_CONTENT[I]=`for((i=1;i<="$COL";i++))
    do
        for((j=1;j<="$ROW";j++))
            do
                sed -n ''$i'p' tmp | awk '{printf("%s",
$j')}'
                if [ $j -ne $ROW ];then
                    echo -n " & "
                else
                    echo "\\ \\hline"
                fi
            done
    done`
done
COL=7
ROW=5
FILE=( null VG.log DMESG.log HW.log FS.log )
HOST=( host 1.1.1.1 1.1.1.3 1.1.1.4 1.1.1.5 1.1.6 )
VG=( vg )
DMESG=( dmesg )
FS=( filesystem )
HW=( hardware )
vg_begin=`sed -n '/BEGIN/=' VG.log`
vg_end=`sed -n '/END/=' VG.log`
VG_BEGIN=( null $vg_begin )
VG_END=( null $vg_end )
dmesg_begin=`sed -n '/BEGIN/=' DMESG.log`
dmesg_end=`sed -n '/END/=' DMESG.log`
DMESG_BEGIN=( null $dmesg_begin )
DMESG_END=( null $dmesg_end )
fs_begin=`sed -n '/BEGIN/=' FS.log`
fs_end=`sed -n '/END/=' FS.log`
FS_BEGIN=( null $fs_begin )
FS_END=( null $fs_end )
hw_begin=`sed -n '/BEGIN/=' HW.log`
hw_end=`sed -n '/END/=' HW.log`
HW_BEGIN=( null $hw_begin )
HW_END=( null $hw_end )
for((i=1;i<$COL;i++))
do
    if [ "$[${VG_END[i]}-${VG_BEGIN[i]}]" -eq 2 ];then
        VG[i]="ok"
    else
        VG[i]="error"
    fi
    if [ "$[${DMESG_END[i]}-${DMESG_BEGIN[i]}]" -eq 2 ];then
        DMESG[i]="ok"
    else
        DMESG[i]="error"
    fi
    if [ "$[${FS_END[i]}-${FS_BEGIN[i]}]" -eq 2 ];then
        FS[i]="ok"
    else
        FS[i]="error"
    fi
    if [ "$[${HW_END[i]}-${HW_BEGIN[i]}]" -eq 2 ];then
        HW[i]="ok"
    else
        HW[i]="error"
    fi
done
TABLE=`for((i=0;i<$COL;i++))
do
    echo -ne "${HOST[i]} ${VG[i]} ${DMESG[i]} ${FS[i]} ${HW[i]}\n"
done`
echo "$TABLE" > tmp
TAB_COUNT4=`for((i=0;i<="$ROW";i++))
do
    if [ $i -ne $ROW ];then
        echo -n "|l"
    else
        echo -n "|"
    fi
done`
TAB_CONTENT4=`for((i=1;i<="$COL";i++))
do
    for((j=1;j<="$ROW";j++))
        do
            sed -n ''$i'p' tmp | awk '{printf("%s",
$j')}'
            if [ $j -ne $ROW ];then
                echo -n " & "
            else
                echo "\\ \\hline"
            fi
        done
done`
ERROR=`for((i=1;i<"$COL";i++))
do
    if [ "${VG[i]}" = "error" ];then
        echo ${HOST[i]}
        sed -n ''${VG_BEGIN[i]}','${VG_END[i]}'p' VG.log \
            | sed -e 's/VG BEGIN/VG errors:/g' \
            -e '/END/d' -e '/OK/d'
    fi
    if [ "${DMESG[i]}" = "error" ];then
        sed -n ''${DMESG_BEGIN[i]}','${DMESG_END[i]}'p' DMESG.log \
            | sed -e 's/DMESG BEGIN/dmesg errors:/g' \
            -e '/END/d' -e '/OK/d'
    fi
    if [ "${FS[i]}" = "error" ];then
        sed -n ''${FS_BEGIN[i]}','${FS_END[i]}'p' FS.log \
            | sed -e 's/FS BEGIN/filesystem errors:/g' \
            -e '/END/d' -e '/OK/d'
    fi
    if [ "${HW[i]}" = "error" ];then
        sed -n ''${HW_BEGIN[i]}','${HW_END[i]}'p' HW.log \
            | sed -e 's/HW BEGIN/hardware errors:/g' \
            -e '/END/d' -e '/OK/d'
    fi
done`
echo "\documentclass{article}
\author{Kitaluft}
\title{HP-UX AUTO CHECK REPORT}
\begin{document}
\begin{table}
\begin{tabular}{${TAB_COUNT[0]}}
\\hline
${TAB_CONTENT[0]}
\end{tabular}
\end{table}
\begin{table}
\begin{tabular}{${TAB_COUNT[1]}}
\\hline
${TAB_CONTENT[1]}
\end{tabular}
\end{table}
\begin{table}
\begin{tabular}{${TAB_COUNT[2]}}
\\hline
${TAB_CONTENT[2]}
\end{tabular}
\end{table}
\begin{table}
\begin{tabular}{$TAB_COUNT4}
\\hline
$TAB_CONTENT4
\end{tabular}
\end{table}
\begin{table}
\end{table}
$ERROR
\end{document}" | sed -e 's/\\ /\\\\ /g' -e '/.*/s/$/\\\\/g' \
    -e '/^\\/s/\\\\//g' -e '/hline/s/hline\\/hline/g' \
    -e '/hline/s/hline\\/hline/g' -e 's/%/\\%/g' \
    -e 's/_//g' -e '/^$/d' -e '/{}/{n; d;}'  > tmp.tex
latex tmp.tex >/dev/null 2>&1
dvipdf tmp.dvi host_check_report.pdf 1>/dev/null 2>&1
rm tmp*
unset FILE COL ROW TAB_COUNT TAB_CONTENT KEY NUM
exit 0
2、console.exp
#! /usr/bin/expect
# console.exp
# Create by Kitaluft 8-2-14
# Copyright (c) 2014 Kitaluft. All right reserved.
set timeout -1
set HOST [lindex $argv 0]
spawn telnet $HOST
expect "MP login:"
send "Admin\n"
expect "MP password"
send "Admin\n"
expect "MP>"
send "sl\n"
expect {
    "MP:VW>" { send "sel\n" }
    "*Quit:" { send "e" }
}
expect "*>"
send "t"
sleep .5
send "a"
sleep .5
send "3"
sleep .5
send "\n"
sleep .5
send "\n"
sleep .5
send "\n"
sleep .5
send "\n"
sleep .5
send "\n"
expect "*>"
send ""
expect "MP>"
send "x\n"
expect eof
exit 0
3、host.exp
#! /usr/bin/expect
# host.exp
# Create by Kitaluft 8-2-14.
# Copyright (c) 2014 Kitaluft. All right reserved.
set timeout -1
set HOST [lindex $argv 0]
set USER [lindex $argv 1]
set PASSWD [lindex $argv 2]
for {set I 3} {$I<$argc} {incr I} {
    spawn telnet $HOST
    expect login:
    send "$USER\r"
    expect Password:
    send "$PASSWD\r"
    expect {
    "                                       QUIT...........0" {send "\n"}
    "]#" {send "\n"}
    }
    expect {
    "]$ " {send "[lindex $argv $I]\n"}
    "]#" {send "[lindex $argv $I]\n"}
    }
    expect {
    "]$ " {send "exit\n"
        exp_continue}
    "]#" {send "exit\n"
        exp_continue}
    }
}
exit 0
4、make_table.sh
将vg/log/dmesg/hardware/filesystem等信息提取并生成表格
#! /bin/bash
# make_table.sh
# Create by Kitaluft 8-3-14.
# Copyright (c) 2014 Kitaluft. All right reserved.
COL=7
ROW=5
FILE=( null VG.log DMESG.log HW.log FS.log )
HOST=( host 76.1.40.1 76.1.40.3 76.1.40.4 76.1.40.5 76.1.40.18 76.1.40.20 )
VG=( vg )
DMESG=( dmesg )
FS=( filesystem )
HW=( hardware )
vg_begin=`sed -n '/BEGIN/=' VG.log`
vg_end=`sed -n '/END/=' VG.log`
VG_BEGIN=( null $vg_begin )
VG_END=( null $vg_end )
dmesg_begin=`sed -n '/BEGIN/=' DMESG.log`
dmesg_end=`sed -n '/END/=' DMESG.log`
DMESG_BEGIN=( null $dmesg_begin )
DMESG_END=( null $dmesg_end )
fs_begin=`sed -n '/BEGIN/=' FS.log`
fs_end=`sed -n '/END/=' FS.log`
FS_BEGIN=( null $fs_begin )
FS_END=( null $fs_end )
hw_begin=`sed -n '/BEGIN/=' HW.log`
hw_end=`sed -n '/END/=' HW.log`
HW_BEGIN=( null $hw_begin )
HW_END=( null $hw_end )
for((i=1;i<$COL;i++))
do
    if [ "$[${VG_END[i]}-${VG_BEGIN[i]}]" -eq 2 ];then
        VG[i]="ok"
    else
        VG[i]="error"
    fi
    if [ "$[${DMESG_END[i]}-${DMESG_BEGIN[i]}]" -eq 2 ];then
        DMESG[i]="ok"
    else
        DMESG[i]="error"
    fi
    if [ "$[${FS_END[i]}-${FS_BEGIN[i]}]" -eq 2 ];then
        FS[i]="ok"
    else
        FS[i]="error"
    fi
    if [ "$[${HW_END[i]}-${HW_BEGIN[i]}]" -eq 2 ];then
        HW[i]="ok"
    else
        HW[i]="error"
    fi
done
TABLE=`for((i=0;i<$COL;i++))
do
    echo -ne "${HOST[i]} ${VG[i]} ${DMESG[i]} ${FS[i]} ${HW[i]}\n"
done`
echo "$TABLE" > tmp.log
TAB_COUNT=`for((i=0;i<="$ROW";i++))
do
    if [ $i -ne $ROW ];then
        echo -n "|l"
    else
        echo -n "|"
    fi
done`
TAB_Con\=`for((i=1;i<="$COL";i++))
do
    for((j=1;j<="$ROW";j++))
        do
            sed -n ''$i'p' tmp.log | awk '{printf("%s",
$j')}'
            if [ $j -ne $ROW ];then
                echo -n " & "
            else
                echo "\\ \\hline"
            fi
        done
done`
ERROR=`for((i=1;i<"$COL";i++))
do
    if [ "${VG[i]}" = "error" ];then
        echo ${HOST[i]}
        sed -n ''${VG_BEGIN[i]}','${VG_END[i]}'p' VG.log \
            | sed -e 's/VG BEGIN/VG errors:/g' \
            -e '/END/d' -e '/OK/d'
    fi
    if [ "${DMESG[i]}" = "error" ];then
        sed -n ''${DMESG_BEGIN[i]}','${DMESG_END[i]}'p' DMESG.log \
            | sed -e 's/DMESG BEGIN/dmesg errors:/g' \
            -e '/END/d' -e '/OK/d'
    fi
    if [ "${FS[i]}" = "error" ];then
        sed -n ''${FS_BEGIN[i]}','${FS_END[i]}'p' FS.log \
            | sed -e 's/FS BEGIN/filesystem errors:/g' \
            -e '/END/d' -e '/OK/d'
    fi
    if [ "${HW[i]}" = "error" ];then
        sed -n ''${HW_BEGIN[i]}','${HW_END[i]}'p' HW.log \
            | sed -e 's/HW BEGIN/hardware errors:/g' \
            -e '/END/d' -e '/OK/d'
    fi
done`
ERROR=`echo "$ERROR" | sed '/.*/s/$/\\\\/g'`
echo "$ERROR"
echo "\documentclass{article}
\author{Kitaluft}
\title{HP-UX AUTO CHECK REPORT}
\begin{document}
\begin{table}
\begin{tabular}{$TAB_COUNT}
\\hline
$TAB_CONTENT
\end{tabular}
\end{table}
$ERROR
\end{document}" | sed -e 's/\\ /\\\\ /g' -e '/.*/s/$/\\\\/g' \
    -e '/^\\/s/\\\\//g' -e '/hline/s/hline\\/hline/g' \
    -e '/hline/s/hline\\/hline/g' -e 's/%/\\%/g' \
    -e 's/_//g' -e '/^$/d' -e '/{}/{n; d;}'  > tmp.tex
latex tmp.tex >/dev/null 2>&1
dvipdf tmp.dvi running.pdf 1>/dev/null 2>&1
# rm tmp.*
unset FILE COL ROW TAB_COUNT TAB_CONTENT KEY NUM
exit 0
5、text2pdf.sh
将sar输出制成表格
#! /bin/bash
# text2pdf.sh
# Create by Kitaluft 8-3-14.
# Copyright (c) 2014 Kitaluft. All right reserved.
if [ $# -lt 3 ];then
    echo -e "\nUsage: $0 [source file] [key word] [number]\n"
    echo -e "eg: \ta b c d\n\t1 2 3 4\nthen 'key word'=a 'number'=1\n"
    exit 1
else
    if (($#%3));then
        echo -e "Usage Error."
        echo -e "\nUsage: $0 [source file1] [key word1] \
[number1] [source file2] [key word2] [number2]...\n"
        exit 2
    fi
fi
COL=7
ROW=0
FILE=( $1 $4 $7 $10 )
KEY=( $2 $5 $8 $11 )
NUM=( $3 $6 $9 $12 )
TAB_COUNT=( l l l l )
for((I=0;I<"$(($#/3))";I++))
do
#   HEAD[I]=`sed -n '/'${KEY[I]}'/p' ${FILE[I]} | head -1 | sed 's/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/host/'`
#   TABLE[I]=`sed -n '/'${KEY[I]}'/,+'${NUM[I]}'{//b; p}' ${FILE[I]}`
#   echo "${HEAD[I]}
#   ${TABLE[I]}" > tmp
    cat tmp.log > tmp
    ROW=2
    #   ROW=`echo "${HEAD[I]}" | awk '{print NF}'`
    TAB_COUNT[I]=`for((i=0;i<="$ROW";i++))
    do
        if [ $i -ne $ROW ];then
            echo -n "|l"
        else
            echo -n "|"
        fi
    done`
    TAB_CONTENT[I]=`for((i=1;i<="$COL";i++))
    do
        for((j=1;j<="$ROW";j++))
            do
                sed -n ''$i'p' tmp | awk '{printf("%s",
$j')}'
                if [ $j -ne $ROW ];then
                    echo -n " & "
                else
                    echo "\\ \\hline"
                fi
            done
    done`
done
echo "\documentclass{article}
\author{Kitaluft}
\title{HP-UX AUTO CHECK REPORT}
\begin{document}
\begin{table}
\begin{tabular}{${TAB_COUNT[0]}}
\\hline
${TAB_CONTENT[0]}
\end{tabular}
\end{table}
\begin{table}
\begin{tabular}{${TAB_COUNT[1]}}
\\hline
${TAB_CONTENT[1]}
\end{tabular}
\end{table}
\begin{table}
\begin{tabular}{${TAB_COUNT[2]}}
\\hline
${TAB_CONTENT[2]}
\end{tabular}
\end{table}
\end{document}" | sed -e 's/\\ /\\\\ /g' -e 's/%/\\%/g' -e '/^$/d' -e '/{}/{n; d;}'  > tmp.tex
latex tmp.tex
#>/dev/null 2>&1
dvipdf tmp.dvi sar.pdf
#1>/dev/null 2>&1
# rm tmp.*
unset FILE COL ROW TAB_COUNT TAB_CONTENT KEY NUM
exit 0

Leave a Reply

Your email address will not be published. Required fields are marked *