1225 用户,组,getopts命令,数组array

/etc
paddwd
shadow
group
gshadow


用户:
管理员:UID,root 0
系统用户:UID ,1-499
图通用户:UID, >500

16bit,UID,2^16,0-65535
redhat: 2^32

authentication(认证)
authorization(授权)
login程序用于用户登录认证

组:GID
私有组
共有组
系统组


用户:基本组,附加组

#useradd
-u UID ;
-g GID;基本组
-G GID;附加组,多个用“,”隔开
-s shell
-d home_dir
-M 不为此用户创建家目录
-m 强行创建家目录
-r (加系统用户)

创建后修改

#chsh user 改变user的shell
#usermod
-u
-g
-G -a (添加附加组)
-s
-d -m (改变家目录,同时把用户文件复制过去)
-l 改登录名
-e 密码过期时间
-f 0表密码过期就禁用,-1表密码过期后永不禁用

MD5,salt(随机附加信息)
单向加密:定长输入,特征码,不可逆,雪崩效应
MD5,128
sha1,160(更安全,速度慢点)

#passwd 改密码
-l 加锁
-u 解锁
--stdin 非交互式改密码
-x 最长使用期限
echo '123' | passwd --stdin join

#groupadd

-g GID
-r (加系统组)
#groupmod
-g GID
-n grp_name

#gpasswd

#newgrp (临时切换组,在有gpasswd的基础上)

id username (显示ID信息)


实例:
一次添加20个用户,用户名和密码相同
#!/bin/bash
for I in {1..20};do
if ! cut -d: -f1 /etc/passwd | grep "^user${I}$" &> /dev/null;then
useradd user$I
echo "user$I" | passwd --stdin user$I
fi
done






删除用户
userdel -r(同时删除家目录)

实例:
#/bin/bash
for [1..30];do
if cut -d: -f1 /etc/passwd | grep "^user${I}$" &> /dev/null ;then
useradd -r user$I
fi
done





date + "%s"(现在离1970年1月1日经过了多少秒,除以86400得出天数)

#!/bin/bash
[ ! $USER=root ] && echo "only root can execute this script" && exit 1
let X=$((`date +"%s"`/86400))
FILE='/etc/shadow'
while read LINE
do
U=`echo $LINE | cut -d: -f1 `
let I=`echo $LINE | cut -d: -f5 `
if [ $((I-X)) le 10 ];then
echo "please change $U's passwd ! "
fi

done < $FILE








getopts命令
while getopts ":abcd" SWITCH;do // :忽略getopts本身的错误信息
case $SWITCH in
a);;
b);;
c);;
d);;
\?);;
esac

done



$0 表脚本本身


free -m (以兆为单位显示物理内存和虚拟内存使用情况)



free -m |grep "^Mem" | awk '{print $2}' //awk以空格截取,$2表第二段




cut -d: -f3 /etc/passwd | grep -v "65534" |sort -n |tail -1




userad.sh
#!/bin/bash
usage() {
echo -e "\033[31mUsage:\003[0m`basename $0` [-u UID] username"
}
while getopts ":u:" SWITCH ;do
case $SWITCH in
u)
NEWUID=$OPTARG
cut -d: -f3 /etc/passwd | grep "^NEWUID" &> /dev/null && echo "UID exists."&& exit 1
;;
\?)
usage
exit 1
;;
esac

NGID=$[`cut -d: -f3 /etc/group | grep -v "65534" |sort -n |tail -1`+1]

NUID=$[`cut -d: -f3 /etc/passwd | grep -v "65534" |sort -n |tail -1`+1]
TODAY=$[`date +"%s"`/86400]
#groupadd
if ! cut -d: -f1 /etc/group |grep $1 &> /dev/null;do
echo "$1:x:$NGID: ">> /etc/group
else
echo "group $1 is already exist";exit 1
fi
#useradd
if ! cut -d: -f1 /etc/passwd |grep $1 &> /dev/null;do
echo "$1:x:${NEWUID:=$NUID}:$NGID::/home/$1:/bin/bash" >> /etc/passwd
echo "$1:!!:$TODAY:0:99999:7:::" >> /etc/shadow
else
echo "user $1 is already exist";exit 1
fi
#home directory
cp -r /etc/skel /home/$1
chown -R $1:$1 /home/$1
chmod -R go=--- /home/$1


日志:
/var/log/wtmp(成功的登陆)
/var/log/btmp(失败的登陆)


#last (查看成功登陆记录)

#last -n 10 查看最近的10次成功登陆
#lastb 查看失败登陆
#lastb -n 10
#lastlog 每一位用户最近的登陆信息
#lastlog -u root
#watch -n 1 last -n 10 (监控,不退出;每一秒刷新一次)


umask (默认022,只是当前生效;;; 普通用户默认是002)
666-umask 644 ()
777-umask 755

#umask
#umask 023 (创建的如果是文件,不可能是可执行的,系统会自动加1)

SUID :u, x,s S 如果制了SUID,以文件的属主执行
SGID :g,x,s,S 以文件的属组执行
STICKY:o,x,t,T 粘滞位(保证全局目录里面的文件只允许属主自己删自己的文件,不能删别人的)

# chmod g+s /share

#ll /usr/bin/passwd 已经值了SUID

#ll /bin/ls
#ll /root -d

chmod 4755 /share

4:SUID
2:SGID
1:STICKY


chmod 7755 /share

#trap
#type trap

trap 'command' signal





数组array

对bash而言,数组
数组下标的范围没有任何限制,同时也不必使用连续的分量。可以通过${array[i]}.访问数组中的元素。如果不指定元素

,则表示第一个元素。@ 与*相同,但是使用时加引号,并在引号中返回每个参数,*则作为一个整体的字符串返回。

# A=(a b c def)
# echo ${A[@]}
a b c def
# echo ${A}
a
echo ${A[*]}
a b c def
for i in "${A[@]}"; do
echo $i
done
显示的结果:
a
b
c
def

for i in "${A[*]}"; do
echo $i
done
显示结果:
a b c def

显示目前有值的数组序号:
# echo ${!A[@]}
0 1 2 3
//取得数组元素的个数
# echo ${#A[@]}
4
显示第3个元素里面的元素的个数:
echo ${#A[3]}
3
echo ${#A[2]}
1

//清除变量
$ unset A
$ echo ${A[@]}
$
A=B
B=C
unset $A 事实上所取消的变量是 B 而不是 A

//清空变量,即将值变为空
$ A=
$ echo ${A[@]}
$






echo $RANDOM


1)完成对所在组随机挑一个人,
2)挑2个人
3)n个人 selectuser.sh -n


name1 name2 name3 name4 name5 name6 name7 name8



1)
#!/bin/bash
a=(name1 name2 name3 name4 name5 name6 name7 name8)
N=$[$RANDOM%8]

echo "${a[$N]}is select."


2)
#!/bin/bash
b=(name1 name2 name3 name4 name5 name6 name7 name8)
c0=$[$RANDOM%8]
c1=$[$RANDOM%8]
while [ $c1 -ge $c0 ] ; do
c1=$[$RANDOM%8]
done

echo "${b[$c0]},${b[$c1]} is select."


3)

#!/bin/bash
b=(name1 name2 name3 name4 name5 name6 name7 name8)

LEN=${#b[*]}
let I=0
while [ $I -le $(($LEN-1)) ] ; do
c[$I]=${b[$I]}
let I++
done


selectuser(){
M=$[$RANDOM%8]
while [ ! ${c[$M]}=${b[$M]} ] ; do
M=$[$RANDOM%8]
done
echo "${c[$M]} is select."
unset c[$M]

}


while getopts ":n:" SWITCH;do
case $SWITCH in
n) let J=$OPTARG
if [ $J -le $[$LEN+1] -a $J -ge 1 ];then
while [ $J -ge 1 ]; do
selectuser
let J--
done
else

echo "Please give a right number[1-`$[$LEN+1]`]" && exit
fi
;;

\?)echo "Please input -n and number[1-`$[$LEN+1]`]" && exit
;;
esac
done





 

你可能感兴趣的:(用户,组,休闲,getopts命令,数组array)