Linux08 facl、basename、mail、hostname、RANDOM及CASE语句

文件系统访问列表

FACL: Filesystem Access Control List
利用文件扩展保存额外的访问控制权限
getfacl /etc/inittab
setfacl  # 设定用户的额外访问控制列表
	-m:设定额外的控制列表
		u:UID:perm
		setfacl -m u:user1:rw- /backup/inittab
		g:GID:perm
		setfacl -m g:developteam:
	-x:取消
		u:UID
		setfacl -x u:user1 /backup/inittab 
		g:GID
		setfacl -x g:mygroup /back/inittab

	-m:
		d:u:UID:perm  # 给某个目录设定用户访问控制列表

给用户设定访问控制权限:设定好之后这个文件的权限后面会多出来一个”+“,表示这个文件有扩展属性。

取消某个用户对某个文件的访问控制权限:

给用户组设定访问控制权限:

user8可以写入inittab文件:

user9可以写入inittab文件:

取消某个用户组对某个文件的访问控制权限:

用户进程访问文件时权限的查找顺序:

Linux用户终端

w:/var/log/utmp ,显示登录的有效用户,比who显示的更详细。
whoami:显示当前系统的有效用户,但是这个用户不一定是登录进来的,有可能是su过来的。
user:
who :/var/log/utmp ,显示登录的有效用户
	-H # 显示显示信息的head,表明每一列是什么信息
	-r # 希纳是当前及上一次的运行级别
last:用于显示/var/log/wtmp文件,哪个远程主机登陆的、什么时间登陆的、停留了多长时间,现在是否还处于登录状态。
	-n # :显示最近#次的相关信息
lastb:/var/log/btmp文件,显示用户错误的登录尝试。。
lastlog:显示每一个用户最近一次的成功登录信息
	-u USERNAME:显示特定用户最近一次的登录信息

终端设备:
	console:控制台  # 直接连接到当前主机上的键盘和显示器
		pty:物理终端(VGA)  physical terminal
         tty#:虚拟控制台(VGA:虚拟终端)比如:xshell,一般都安装在本地,虚拟出来的一个远程访问终端
         ttys:串行终端
         pts/number:伪终端,在伪文件系统上形成的一个假的终端

basename

basename:
	basename 路径 # 取出路径的后蜀第一个路径名
	bash /etc/passwd   --> passwd
	basename ./shell_script/  --> shell_script/
	
	$0 执行脚本是的脚本路径及脚本名称
	在脚本中,使用basename 获取用户的文件名:
		basename $0

mail

mail: # 查看邮件
	-s : 指定邮件标题
	mail -s "How are you?" root < /etc/fstab 给root用户发邮件标题为 "How are you?",正文是fstab;这里使用的是输入重定向。

hostname

hostname:显示主机名
如果当前主机的主机名不是www.magedu.com,就将其改为www.magedu.com

如果当前主机的主机名是localhost,就将其改为www.magedu.com

如果当前主机的主机名为空,或者为(none),或者为localhost,就将其改为www.magedu.com
[ -z `hostname` ] || [ `hostname` == '(none)' -o `hostname` == 'localhost' ] && hostname www.magedu.com 

生成随机数(RANDOM)


RANDOM:系统变量,是由bash自己维护的,输入RANDOM会生成0~32768的一个随机数

随机数生成器:
/dev/random  # 更安全
/dev/urandom  # 不会阻塞

写一个脚本,利用RANDOM生成10个随机数,并找出其中的最大值;

#!/bin/bash
#

#let MINSUM=0
#let MAXSUM=0
#for i in {1..10};do
#  if [ $i -lt 9 ];then
#    echo -n "$RANDOM,"
#  else
#    echo "$RANDOM"
 # fi
#done

# 方式一:
declare -i MINSUM=0
declare -i MAXSUM=0
for i in {1..10};do
  MYRAND=$RANDOM
  if [ $i -le 9 ];then
      echo -n "$MYRAND,"
  else
    echo "$MYRAND"
  fi

  if [ $i -eq 1 ];then
    MINSUM=$MYRAND
    MAXSUM=$MYRAND
    continue
  fi
  if [ $MAXSUM -lt $MYRAND ];then
    let MAXSUM=$MYRAND
  else
    if [ $MINSUM -ge $MYRAND ];then
      let MINSUM=$MYRAND
    fi
  fi
done
echo "MAXSUM is $MAXSUM,MINSUM is $MINSUM ."

# 方式二:
#!/bin/bash
#
declare -i MAX=0
declare -i MIN=0
for i in {1..10};do
  MYRAND=$RANDOM
  [ $i -eq 1 ] && MIN=$MYRAND
  if [ $i -le 9 ];then
    echo -n "$MYRAND,"
  else
    echo "$MYRAND"
  fi
  [ $MYRAND -ge $MAX ] && MAX=$MYRAND
  [ $MYRAND -lt $MIN ]  && MIN=$MYRAND
done
echo "$MAX,$MIN"

case 选择结构

case语句:先择结构

用法:
case SWITCH in  # SWITCH 代表要引用的变量的值
value1)
  statement
  ...
  ;;  # 每个条件下用双分号结尾
value2)
  statement
  ...
  ;;
*)   # 表示既不是第一种可能性,也不是第二种可能性,是其他任意可能性
  statement
  ...
  ;;
esac  

#!/bin/bash
#
DEBUG=0

case $1 in
-v|--verbose)
  DEBUG=1
  ;;
*)
  echo "Unknown options." 
  exit 7
  ;;
esac

[ $DEBUG -eq 1 ] && echo "hello."
只接受参数start,stop,restart,status其中之一

#!/bin/bash
#
case $1 in 
'start')  # 表示将start字符串作为一个整体  如果是 ('start') ,表示从start中取一个字符
   echo "start server..." ;;
'stop')
  echo "stop server..." ;;
'restart')
  echo "Restarting server..." ;;
'status')
  echo "Running..." ;;
*)
  echo "`basename $0` {start|stop|restart|status}" ;;
esac

写要给脚本,可以接受选项及参数,而后能获取每一个选项,及选项的参数;并能根据选项及参数做出特定的操作。比如:adminuers.sh --add tom,jerry ==del tom,blair -v|--verbose -h|--help

#!/bin/bash
#
DEBUG=0
ADD=0
DEL=0

for i in `seq 1 $#`;do
  if [ $# -gt 0 ];then
    case $1 in
    -v|--verbose)
      DEBUG=1
      shift ;;
    -h|--help)
      echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help" 
      exit 0
      ;;
    --add)
      ADD=1
      ADDUSERS=$2
      shift 2
      ;;
    --del)
      DEL=1
      DELUSERS=$2
      shift 2
      ;;
      *)
      echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
      exit 7
      ;;
    esac
  fi
done

if [ $ADD -eq 1 ];then
  for USER in `echo $ADDUSERS | sed 's@,@ @g'`;do
    if id $USER &> /dev/null;then
      [ $DEBUG -eq 1 ] && echo "$USER exists."
    else
      useradd $USER
      [ $DEBUG -eq 1 ] && echo "Add user $USER finished."
    fi
  done
fi

if [ $DEL -eq 1 ];then
  for USER in `echo $DELUSERS | sed 's@,@ @g'`;do
    if id $USER &> /dev/null;then
      userdel -r $USER
      [ $DEBUG -eq 1 ] && echo "Delete $USER finished."
    else
      [ $DEBUG -eq 1 ] && echo "$USER not exist."
    fi
  done
fi

写一个脚本showlogged.sh,其用法格式为:showlogged.sh -v -c -h|--help 其中,-h选项只能单独使用,用于显示帮助信息;-c选项时,显示当前系统上登录的所有用户户数;如果同时使用了-v选项,则既显示同时登录的用户数,又显示登录的相关信息;如:

*

#!/bin/bash
#
declare -i DEBUG=0
declare -i SHOWNUM=0
declare -i SHOWUSERS=0

for i in `seq 1 $#`;do
  if [ $# -gt 0 ];then
    case $1 in 
    -h|--help)
      echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"
      exit 0  
      ;;
    -v|--verbose)
      let SHOWUSERS=1 
      shift ;;
    -c|--count)
      let SHOWNUM=1 
      shift ;;
    *)
      echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"
      exit 8 
      ;;
    esac
  fi
done

if [ $SHOWNUM -eq 1 ];then
  echo "Logged users:`who | wc -l`."
  if [ $SHOWUSERS -eq 1 ];then
    echo "They are:`who`"
  fi
fi

posted on 2021-04-25 17:03  jueyuanfengsheng  阅读(156)  评论(0编辑  收藏  举报