文档章节

day20:早中晚输入问候程序|菜单执行对应命令|检测用户是否登录系统|

芬野de博客
 芬野de博客
发布于 01/14 23:05
字数 1877
阅读 9
收藏 0

1、编写一个问候程序,它根据当前的时间来执行,假设从夜里到中午为早晨,中午到下午六点为下午,下午六点到半夜为网上;

注释:可以用date +%H  来判断小时;              if  [  $h  -ge 0  ] &&  [  $h -lt  12  ]     来判读时区

[root@localhost_002 shell100]# date +%H
22

脚本如下

[root@localhost_002 shell100]# cat 41.sh 
#!/bin/bash
h=`date +%H`
if [ $h -ge 0 ] && [ $h -lt 12 ]
then
   echo "gond  morning."
elif [ $h -ge 12 ] && [ $h -lt 18 ]
then
  echo "good afternoon"
else
  echo "good evening"
fi

执行脚本;
[root@localhost_002 shell100]# sh 41.sh 
good evening

方法二:当然也可以用如下方法:使用 if 判断tag 打标记的方法;然后通过 case来循环

[root@localhost_002 shell100]# cat 41.1.sh 
#!/bin/bash
h=`date +%H`
if [ $h -ge 0 -a $h -lt 12 ]
then 
   tag=1
elif [ $h -ge 12 -a $h -lt 18 ]
then
   tag=2
elif [ $h -ge 18 -a $h -lt 21 ]
   then
   tag=3
else
   tag=4
fi
case $tag in 
    1)
    echo "good morning"
    ;;
    2)
    echo "good afternoon"
    ;;
    3)
    echo "good evening"
    ;;
    4)
    echo "bash is error"
    ;;
esac

执行;
[root@localhost_002 shell100]# sh -x 41.1.sh 
++ date +%H
+ h=23
+ '[' 23 -ge 0 -a 23 -lt 12 ']'
+ '[' 23 -ge 12 -a 23 -lt 18 ']'
+ '[' 23 -ge 18 -a 23 -lt 21 ']'
+ tag=4
+ case $tag in
+ echo 'bash is error'
bash is error

注释if 的语句用法: 如下两种格式:         并且 可以用   &&  或者    -a    来表示;

if  [ $h -ge 0 ]  &&  [ $h -lt  12 ]  then  tag=1    elif  [ 判断 ]  then   tag=2    elif  [ 判断 ]  then  tag=3   else   tag=4  

if  [ $h -ge 0   -a   $h  lt  12 ]

然后分别用 case  来循环;  case  $tag  in   1)  echo "gond  morning" ;;   2)  echo "......." ;;    3)   echo "......." ;;    4)  ".........." ;;    esac

2、写一个 shell  脚本,实现弹出菜单功能,用户根据显示的菜单从键盘选择执行对应的命令;

其实这个题可以用 readcase 参数来实现的;

首先 echo 显示一下内容要求用户输入:    -n  表示换行符    -e  能够识别特殊字符

echo  -e  "1)    w\n2)   ls\n3)    pwd\4)    quit"

然后再使用 read 来使用;    read   -p   "please   input your  nubmer  "  c                  注释:  c 是一个变量;

脚本如下:

[root@localhost_002 shell100]# cat 42.sh 
#!/bin/bash
echo -e "1) w\n2) ls\n3) pwd\n4) quit"
read -p "Please input you number: " c
case $c in 
     1)
        w
       ;;
     2)
       ls
       ;;
     3)
      pwd
       ;;
     4)
      exit
      ;;
     *) 
      echo "bash is error"
     ;;
esac
执行命令;
[root@localhost_002 shell100]# sh 42.sh 
1) w
2) ls
3) pwd
4) quit
Please input you number: 2
16.sh  1.txt  22.1.sh  23.sh  28.1.sh  28.sh  30.sh    41.2.sh	42.sh	   stu.txt
17.sh  21.sh  22.sh    25.sh  28.2.sh  2.txt  41.1.sh  41.sh	ls.tar.gz

注释:由于上面是执行后自动退出,当然也可以写成死循环的方式,一直循环下去;用while :   do   done

[root@localhost_002 shell100]# cat 42.sh 
#!/bin/bash
echo -e "1) w\n2) ls\n3) pwd\n4) quit"
while :                                  # 新加 while  循环语句;
do
read -p "Please input you number: " c
case $c in 
     1)
        w
       ;;
     2)
       ls
       ;;
     3)
      pwd
       ;;
     4)
      exit
      ;;
     *) 
      echo "bash is error"
     ;;
esac                                     
done                                        # while 循环语句结束;
执行脚本;
[root@localhost_002 shell100]# sh 42.sh 
1) w
2) ls
3) pwd
4) quit
Please input you number: 1
 22:30:03 up 9 min,  1 user,  load average: 0.02, 0.08, 0.09
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  22:21    3.00s  0.06s  0.01s w
Please input you number: 2
16.sh  1.txt  22.1.sh  23.sh  28.1.sh  28.sh  30.sh    41.2.sh	42.sh	   stu.txt
17.sh  21.sh  22.sh    25.sh  28.2.sh  2.txt  41.1.sh  41.sh	ls.tar.gz
Please input you number: 3
/root/shell/shell100

注释:如上脚本,也只是新加 while 的语句而已;可以实现不断循环输入;当然要是输入 4 选项,即 exit  还是会退出此脚本;

当然还有一个方法:  可以使用 select  语句,这个语句和for 循环的语法相同,也可以遍历文件;

select  格式如下:           select  i    in   w  ls   pwd   exit   do   case语句    done

注释 select  语句会一直执行下去的,并且左侧以 #? 结尾;用法如下;

[root@localhost_002 shell100]# cat 42.1.sh 
#!/bin/bash

select i in w ls pwd exit
do
    case $i in 
        w)
           w
           ;;
       ls)
          ls
           ;;
      pwd)
          pwd
           ;;
     exit)
         exit
          ;;
      *)
        echo "Please input 1-4."
          ;;
     esac
done
执行命令;
[root@localhost_002 shell100]# sh 42.1.sh 
1) w
2) ls
3) pwd
4) exit
#? 2
16.sh  1.txt  22.1.sh  23.sh  28.1.sh  28.sh  30.sh    41.2.sh	42.1.sh  ls.tar.gz
17.sh  21.sh  22.sh    25.sh  28.2.sh  2.txt  41.1.sh  41.sh	42.sh	 stu.txt
#? 1
 22:38:43 up 18 min,  1 user,  load average: 0.00, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  22:21    3.00s  0.09s  0.00s w
#? 3
/root/shell/shell100

注释:当然 左侧 #? 是可以修改了的,只需要在开头添加如下内容即可;如下;

PS3="Please input  you number(1-4): "

[root@localhost_002 shell100]# cat 42.1.sh 
#!/bin/bash
PS3="Please input you number(1-4): "
select i in w ls pwd exit
do
    case $i in 
        w)
           w
           ;;
       ls)
          ls
           ;;
      pwd)
          pwd
           ;;
     exit)
         exit
          ;;
      *)
        echo "Please input 1-4."
          ;;
     esac
done
执行脚本:
[root@localhost_002 shell100]# sh 42.1.sh 
1) w
2) ls
3) pwd
4) exit
Please input you number(1-4): 2
16.sh  1.txt  22.1.sh  23.sh  28.1.sh  28.sh  30.sh    41.2.sh	42.1.sh  ls.tar.gz
17.sh  21.sh  22.sh    25.sh  28.2.sh  2.txt  41.1.sh  41.sh	42.sh	 stu.txt
Please input you number(1-4): 1
 22:44:12 up 23 min,  1 user,  load average: 0.04, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  22:43    4.00s  0.05s  0.01s w
Please input you number(1-4): 3
/root/shell/shell100
Please input you number(1-4): 

注释:这个脚本会一直不断的循环下去,不会退出的;

3、写一个 shell 脚本,每隔 5 分钟判断指定的用户是否登录系统;        需要指定用户名;

注释:如果先登录root 用户,然后通过root用户去sudo 到 yuanhh 用户, 那么这种情况是查询不到,也是会显示 root;

分析: 如果要判断用户是否登录,\从命令行输入判断可以有两种方式,

1)、脚本本执行时 传递一个参数;通过用  命令查看并打印第一列;

2)、另一种是给它一个用户,通过 read  -p  命令;

首先用第一种脚本传递参数的方式:

[root@localhost_002 shell100]# w
 22:58:45 up 38 min,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  22:43    5.00s  0.07s  0.02s w
[root@localhost_002 shell100]# w|awk '{print $1}'|sed '1,2'd
root

脚本代码如下:

[root@localhost_002 shell100]# cat 43.sh 
#!/bin/bash
while :
do
   if  w|sed '1,2'd|awk '{print $1}' |grep -qw "$1"
   then
       echo "用户$1已经登录系统"
       exit
   fi
   sleep  30
done
执行:
[root@localhost_002 shell100]# sh 43.sh root
用户root已经登录系统

方法二: 当然也可以用 read  -p  给一个用户,然后来判断;

4、先普及一个小常识,我们用ps aux可以查看到进程的PID,而每个PID都会在/proc内产生。如果查看到的pid在proc内是没有的,则进程被人修改了,这就代表系统很有可能已经被入侵过了。 请用上面知识编写一个shell,定期检查下自己的系统是否被人入侵过

#!/bin/bash
pp=$$
ps -elf |sed '1'd > /tmp/pid.txt
for pid in `awk -v ppn=$pp '$5!=ppn {print $4}' /tmp/pid.txt`
do
    if ! [ -d /proc/$pid ]
    then
	echo "系统中并没有pid为$pid的目录,需要检查。"
    fi    
done

5、想办法把文本里面每三行内容合并到一行 例如:1.txt内容

1
2
3
4
5
6
7

处理后应该是

1 2 3
4 5 6
7

 

#!/bin/bash
n=1
cat $1 |while read line 
do
    n1=$[$n%3]
    if [ $n1 -eq 0 ]
    then
	echo "$line"
    else
	echo -n "$line " 
    fi
    n=$[$n+1]
done

© 著作权归作者所有

共有 人打赏支持
芬野de博客
粉丝 15
博文 153
码字总数 263355
作品 0
海淀
程序员
私信 提问
Linux系统安全及应用

作为一个开放源代码的操作系统,Linux服务器以其安全、高效和稳定的显著优势而得以广泛应用。下面主要从账户安全、系统引导、登录控制的角度,优化Linux系统的安全性 账号安全控制 用户账号,...

杨书凡
2017/12/27
0
0
《Linux0.11内核完全注释》读书笔记之内核启动方式总结

Linux0.11启动方式 BIOS启动 当PC电源打开后,80X86结构的CPU将自动进入实模式,并从0xFFFF0开始自动执行程序,这通常是ROM-BIOS中的地址。PC机的BIOS将执行某些系统检测,并在物理地址0处开...

开源中国精神科主任
2014/12/09
0
0
Linux安全攻略 如何修复系统的Root密码

如果因为忘了root口令导致无法登录系统,请试用下面的方法来改忘记的root口令: 方法一: 1、重新启动系统。待系统启动到grub或lilo(现在一般是grub)引导菜单时,找到系统当前引导项(可以...

zt371
2009/05/07
227
0
你的Linux服务器被黑了?看一看是不是犯了这5点错

转自:http://os.51cto.com/art/201707/545341.htm 安全是IT行业一个老生常谈的话题了,从之前的“棱镜门”事件中折射出了很多安全问题,处理好信息安全问题已变得刻不容缓。因此做为运维人员...

holy2009
2017/07/27
0
0
MySQL专题2之MySQL在linux上的安装

- 所有平台的MySQL下载地址为http://www.mysql.com/downloads,挑选你需要的MySQL Community Server版本以及对应的平台。 1、Linux/UNIX上安装MySQL - Linux平台上推荐使用RPM包来安装MySQL...

极客微信条
2017/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

zookeeper和HBASE总结

zookeeper快速上手 zookeeper的基本功能和应用场景 zookeeper的整体运行机制 zookeeper的数据存储机制 数据存储形式 zookeeper中对用户的数据采用kv形式存储 只是zk有点特别: key:是以路径...

瑞查德-Jack
48分钟前
1
0
Oracle 查询时间在当天的数据

要实现这个功能需要用到trunc这个函数对时间的操作select trunc(sysdate) from dual --2014-12-27 今天的日期为2014-12-27select trunc(sysdate, 'mm') from dual --2014-12-1 ......

覃光林
50分钟前
1
0
阿里技术专家详解 Dubbo 实践,演进及未来规划

作者:曹胜利 链接:https://www.infoq.cn/article/IwZCAp3jo_H5fJFbWOZu?utm_source=tuicool&utm_medium=referral Dubbo 整体介绍 Dubbo 是一款高性能,轻量级的 Java RPC 框架。虽然它是以...

Java干货分享
53分钟前
1
0
深入解读阿里云数据库POLARDB核心功能物理复制技术

日志是数据库的重要组成部份,按顺序以增量的方式记录了数据库上所有的操作,日志模块的设计对于数据库的可靠性、稳定性和性能都非常重要。 可靠性方面,在有一个数据文件的基础全量备份后,...

阿里云官方博客
57分钟前
1
0
Python数据科学环境:Anaconda 了解一下

几乎所有的 Python 学习者都遇到过“安装”方面的问题。这些安装问题包括 Python 自身环境的安装、第三方模块的安装、不同版本的切换,以及不同平台、版本间的兼容问题等。当你因为这些问题而...

crossin
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部