LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: KornLee

【shell脚本欣赏区】:[展示你的作品的好去处!欢迎投帖]

[复制链接]
 楼主| 发表于 2003-4-9 01:00:47 | 显示全部楼层

一个小计算器脚本

作者:javalee
  1. avalee//home/javalee/lx>cat js
  2. #! /bin/ksh
  3. #scriptname:js
  4. #the script is example about co-process
  5. echo "WELCOME TO THE CALCULATOR PROGRAM"
  6. bc |&
  7. while true
  8. do
  9. echo "Select one of the opertors"
  10. echo "a)=+      s)=-    m)=*    d)=/    q)=quit"
  11. read op
  12. case $op in
  13. a) op="+" ;;
  14. s) op="-" ;;
  15. m) op="*" ;;
  16. d) op="/" ;;
  17. q|Q) op="q" exit ;;
  18. *) print "wrong option,input again..." ; sleep 1
  19. continue ;;
  20. esac
  21. print -p scale=3
  22. echo -n "please enter two numbers:"
  23. read n1 n2
  24. print -p "$n1" "$op" "$n2"
  25. read -p result
  26. print $result
  27. print -n "continue (y/n)? "
  28. read answer
  29. case $answer in
  30. [Nn]*)
  31. break;;
  32. esac
  33. done
  34. print "Good bey"
复制代码
 楼主| 发表于 2003-4-9 01:03:19 | 显示全部楼层

数制转换的脚本

作者;javalee
  1. #! /bin/ksh
  2. print 转换进制:
  3. if [[ -z $1 || $1 == [a-zA-Z]* || $# > 1 ]]
  4. then
  5. cat <<info
  6. Usage:cn number[Enter]
  7. cn 2#number     for binary style
  8. cn 16#number    for hex style
  9. cn number       for stand style
  10. info
  11. exit
  12. fi
  13. integer -i10 value=$1
  14. print "十进制: \t $value"D""
  15. typeset -i16 value
  16. print "十六进制: \t $value"H""|sed 's/16#//'
  17. typeset -i2 value
  18. v2=$(print $value|sed 's/2#//')
  19. integer len=${#v2}
  20. ((n=8-$len))
  21. v=$(echo $(perl -e "print 0 x $n")$v2)
复制代码
 楼主| 发表于 2003-4-9 01:08:24 | 显示全部楼层

禁止用户登录脚本

作者:javalee
要想让某些用户不能登录系统,可以用简单脚本实现
  1. #! /bin/ksh
  2. #scriptname:killuser
  3. #disabel some user login system
  4. #start...
  5. echo -n "who do you want to kill:"
  6. read username
  7. while true
  8. do
  9. kill -9 $(ps -aux|grep $username|awk '{print $2}')
  10. sleep 1
  11. done
  12. javalee//home>su abc    //用户abc登录成功
  13. Password:
  14. abc//home>
  15. root//home/javalee/lx>sh killuser    //运行
  16. who do you want to kill:abc
  17. ...
  18. javalee//home>su abc    //运行脚本后,被KILL
  19. Password:
  20. abc//home>Killed
  21. javalee//home>    //登录失败,返回
复制代码
 楼主| 发表于 2003-4-9 01:10:39 | 显示全部楼层

禁止用户登录脚本

特别感谢作者:kpjiang兄
可以先建立一个deny.user的文件,内容如下:
user1
user2
user3
然后将下列代码加到 /etc/porfile里
logname=`whoami |grep '{print $1}'`
while read i; do
if [ $i =$logname ]; then
echo "Sorry,$LOGNAME can not login" && exit
fi
do < /path/deny.user
 楼主| 发表于 2003-4-19 19:54:08 | 显示全部楼层

一个简单的限时登录方法![转铁]

自己写三个shell程序,调用at和系统维护功能:
1. 在指定的时间执行该shell,在/etc下生成一名为nologin的文件,如:
vi /sbin/login.denied
echo " Login Denied " > /etc/nologin
chmod 700 login.denied
2. 在指定的时间执行该shell,删除/etc/下的nologin文件,如:
vi /sbin/login.allowed
if [ -f /etc/nologin ]; then
rm /etc/nologin
fi
chmod 700 login.allowed
3. 编写一个限制时间的shell,如:
vi /sbin/security
if [ -f /sbin/login.denied ]; then
at -f /sbin/login.denid 22:00
fi
if [ -f /sbin/login.allowed ]; then
at -f /sbin/login.allowed 8:00
if

此种设置的功能是:从晚上10:00到第二天早上8:00静止非root拥护登录,显示为
系统维护状态。

注:忘了从哪里CP过来的啦~~~请兄弟们见谅;)有知道的请告诉我!
 楼主| 发表于 2003-4-21 12:30:45 | 显示全部楼层

一段shell脚本[转自:UNIX中文社区,特此感谢]

jhpm()
{
echo " [21;08H 若屏幕正常而激活它, 将中断该屏幕所有进程 输入 y 继续 [ ] "
echo " [21;68H\c"
read jx
if [ $jx ] && [ $jx = "y" ]
then
echo " [21;06H┃ 请输屏幕号(按Alt+F1进入第一屏,屏幕号为01,以此类推)--> [ ] ┃"
echo " [21;68H\c"
read PMH
while [ $PMH ]
do
PID=`ps -t tty$PMH | awk 'BEGIN {ORS=" "} NR>1 {print $1}'`
kill -9 $PID;sleep 2
echo " [21;06H┃ 该屏幕已被激活 ! \07\c ┃"
sleep 2
return
done
else return 0
fi
}
 楼主| 发表于 2003-4-26 22:36:33 | 显示全部楼层

如何停止终端多个进程[转自:Linuxaid.com特此感谢]

echo "系统当前用户"
echo "---------------"
who | awk '{print $2}'
echo "---------------"
echo "输入要杀死终端的终端号:"
read $TTY
kill -9 ${K}=`ps -t $TTY | grep [0-9] | awk '{print $1}'`
 楼主| 发表于 2003-4-26 22:38:03 | 显示全部楼层

如何查找日期为某一天的文件[转自:Linuxaid.com特此感谢]

#!/bin/sh
# The right of usage, distribution and modification is here by granted by the author.
# The author deny any responsibilities and liabilities related to the code.
#
OK=0
A=`find $1 -print`
if expr $3 == 1 >/dev/null ; then M=Jan ; OK=1 ; fi
if expr $3 == 2 >/dev/null ; then M=Feb ; OK=1 ; fi
if expr $3 == 3 >/dev/null ; then M=Mar ; OK=1 ; fi
if expr $3 == 4 >/dev/null ; then M=Apr ; OK=1 ; fi
if expr $3 == 5 >/dev/null ; then M=May ; OK=1 ; fi
if expr $3 == 6 >/dev/null ; then M=Jun ; OK=1 ; fi
if expr $3 == 7 >/dev/null ; then M=Jul ; OK=1 ; fi
if expr $3 == 8 >/dev/null ; then M=Aug ; OK=1 ; fi
if expr $3 == 9 >/dev/null ; then M=Sep ; OK=1 ; fi
if expr $3 == 10 >/dev/null ; then M=Oct ; OK=1 ; fi
if expr $3 == 11 >/dev/null ; then M=Nov ; OK=1 ; fi
if expr $3 == 12 >/dev/null ; then M=Dec ; OK=1 ; fi
if expr $3 == 1 >/dev/null ; then M=Jan ; OK=1 ; fi
if expr $OK == 1 > /dev/null ; then
ls -l --full-time $A 2>/dev/null | grep "$M $4" | grep $2 ;
else
  echo Usage: $0 path Year Month Day;
  echo Example: $0 ~ 1998 6 30;
fi
 楼主| 发表于 2003-4-26 22:42:20 | 显示全部楼层

如何列出目录树 [转自:linuxaid 特此感谢]

下面的短小的shell程序可以列出目录树, 充分利用了sed强大的模式匹配能力.

脚本如下:
#!/bin/sh
# dtree: Usage: dtree [any directory]
dir=${1:-.}
(cd $dir; pwd)
find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g"

注:此脚本有点小问题,希望大家还是自己实践一下吧~;)
 楼主| 发表于 2003-4-27 20:51:28 | 显示全部楼层

列出目录树的脚本

特别感谢作者YOO兄
  1. #!/bin/bash
  2. redir ()
  3. {
  4.         #tab是真正的步长计算器
  5.         tab=$tab$singletab
  6.         line=${tab%"$singletab"}"|-------"
  7.         #local比较关键,它规定了count是当前的参数列表值
  8.         local count=$#
  9.         for file in "$@"; do
  10.                 thisfile=${thisfile:-$PWD}/$file
  11.                 #判断当前文件是否为目录,如果是就开始递归   
  12.                 if [ -d "$thisfile" ]; then
  13.                         
  14.                         #如果当前目录是分枝列表的最底层,则需进行特殊处理。
  15.                         if [ $count -eq 1 ]; then
  16.                                 echo -e $line$file/
  17.                                 #将前一个|符号去掉,看看目录树就知道为什么了。
  18.                                 tab=${tab%"$singletab"}"\t"
  19.                                 redir $(ls $thisfile)
  20.                         else
  21.                                 echo -e $line$file/
  22.                                 redir $(ls $thisfile)
  23.                         fi
  24.                         
  25.                 else
  26.                         echo -e $line$file
  27.                 fi
  28.                
  29.                 thisfile=${thisfile%/*}
  30.                 let count=count-1      
  31.         done
  32.         
  33.         #这一步比较有意思,因为从递归出来的tab结尾可能是TAB也可能是$singletab,所以分成两步来去掉。
  34.         tab=${tab%"\t"}
  35.         tab=${tab%"|"}
  36.         line=${tab%"$singletab"}"|-------"
  37. }
  38. singletab="|\t"
  39. userinput="$@"
  40. if ls $userinput; then
  41.         for file in ${userinput:-.}; do
  42.                 echo $file
  43.                 echo '|'
  44.                 if [ -d "$file" ]; then
  45.                         cd $file
  46.                         redir $(ls)
  47.                         cd ..
  48.                 fi
  49.         done
  50. else
  51.         echo "$userinput is wrong"
  52. fi
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表