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: # 查看邮件
-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