添加用户和组的练习
1、创建一个用户mandriva,其ID号位2002,基本组位distro(组ID位3003),附加组位linux
#groupadd -g 3003 distro;groupadd linux;useradd -u 2002 -g 3003 -G linux mandriva
2、创建一个用户fedora,其全名为Fedora Community,默认shell为tcsh
#useradd -c "Fedora Community" -s /bin/tcsh fedora
3、修改mandriva的ID号位4004,基本组位linux,附加组为distro和fedora
#usermod -u 4004 -g linux -a -G distro,fedora
4、给fedora加密码,并设定其密码最短使用期限位2天,最长为50天
#passwd -n 2 -x 50 fedora
5、将mandriva的默认shell改为/bin/bash
#usermod -s /bin/bash mandriva
6、新建一个用户openstack,但不给其创建家目录
#useradd -M openstack
echo pwd123 | passwd --stdin openstack
7、复制/etc/skel目录为/home/openstack
#cp -r /etc/skel /home/openstack
8、改变/home/openstack及其内部的属组均为openstack
#chown openstack:openstack /home/openstack
9、/home/openstack及其内部的文件,属组和其它用户没有任何访问权限
#chown go=--- /home/openstack
作业:
(1)新建系统组mysql;新建系统用户mysql,要求其没有家目录且shell为/sbin/nologin;
#usermod -r -M -s /sbin/nologin mysql
(2)新建GID为600的组magedu;新建用户gentoo,要求其家目录为/users/gentoo,密码同用户名;
#groupadd -g 600 magedu; mkdir /users ;useradd -d /users/gentoo gentoo ;echo gentoo | passwd --stdin gentoo
(3)新建用户centos,其家目录为/users/centos,密码同用户名;
#useradd -d /users/centos ;echo centos | passwd --stdin centos
(4)新建用户www,其家目录为/users/www;删除www用户,但保留其家目录;
#useradd -d /users/www www;userdel www
(5)用户gentoo和centos均以magedu为其附加组;
#usermod -G magedu gentoo;usermod -G magedu centos
完成以下任务:
(1) 切换至centos用户,定义本地变量FirstVar,其值为"test variable";
#su - centos; FirstVar="test variable"
(2) 另启一个终端,使用gentoo用户查看FirstVar变量的值;如果没有值,为什么?
#su - gentoo; echo $FirstVar 发现什么也没有,因为本地变量只对shell有效
(3) 声明一个变量CurTime,其值为当前系统时间;
#CurTime=`date`
(4) 使用echo命令显示"The current time is:",is后跟上CurTime变量的值;
#echo "The current time is:$CurTime"
(5) 回至centos用户的终端:复制/etc/pam.d目录至/tmp目录中,并重命名为test;
#su - centos;cp -r /etc/pam.d /tmp/test
(6) 声明变量FileName,其值为刚才复制的目录/tmp/test;
#FileName=/tmp/test
(7) 修改变量FileName所表示的目录及其内部所有文件的其它用户均没有任何访问权限;
#chmod -R o=--- $FileName
(8) centos用户是否可以修改变量FileName所表示的目录的属主和属组?如果能,将其改为gentoo用户和gentoo组;如果不能,则使用root用户修改;
#centos 用户不能使用chown命令
#su - root
#chown gentoo:gentoo $FileName
grep的练习
1、显示/proc/meminfo文件中以不区分大小的s开头的行;
2、显示/etc/passwd中以nologin结尾的行;
3、取出默认shell为/sbin/nologin的用户列表
4、取出默认shell为bash,且其用户ID号最小的用户的用户名
6、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
7、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
8、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
10、显示/etc/rc.d/rc.sysinit中符合形为"任意单个字符n任意字符任意单个字符n"模式的行;即任意单个字符后面跟了个n,n后面有任意长度的任意字符,
而后是任意单个字符后面跟了个n;
11、显示/etc/rc.d/rc.sysinit中符合形为"任意单个字符n任意字符任意单个字符n"模式的行;即任意单个字符后面跟了个n,n后面有任意长度的任意字符,
而后是任意单个字符后面跟了个n,但后面的n之前的字符要与前面的n之前的字符相同;
12、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
13、找出某文件中的,1位数,或2位数;
14、找出ifconfig命令结果中的1-255之间的整数;
15、查找当前系统上名字为student(必须出现在行首)的用户的帐号的相关信息, 文件为/etc/passwd
16、统计/usr/bin/目录下的文件个数;
17、取出当前系统上所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示;
18、思考:如何显示/var/log目录下每个文件的内容类型?
19、取出/etc/inittab文件的第5行;
20、取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中;
21、显示/etc目录下所有以pa开头的文件,并统计其个数;
22、不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文尾部;
22、显示/proc/cpuinfo中的processor开头且后面跟了至少1个空白字符的行;而后统计相关的行数;
23、显示/var/log/secure文件中包含"Failed password"或"FAILED LOGIN"的行;而后统计相关的行数;
24、显示/var/log/secure文件中记录的属于当前系统时间的前一天的信息中包含"Failed password"或
"FAILED LOGIN"的行;而后统计相关的行数;
25、找出netstat -tan命令执行的结果中以TIME_WAIT或ESTABLISHED结尾的行;
for脚本的练习
练习1:写一个脚本,显示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三个文件各有多少行;
#!/bin/bash
cat > /root/test/1.txt <<EOF
/etc/inittab
/etc/rc.d/rc.sysinit
/etc/fstab
EOF
for File in `cat /root/test/1.txt`;do
echo "$File has: ` wc -l $File | cut -d' ' -f1` rows"
done
#!/bin/bash
#this script count file rows.
for File in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab;do
Row=`wc -l $File | cut -d' ' -f1`
echo "$File has: $Row rows"
done
练习2:写一个脚本
使用for循环创建目录/tmp/1.dir,/tmp/2.dir和/tmp/3.dir,并将它们的权限均修改为750;
#!/bin/bash
for Dir in 1 2 3;do
if [ -d /tmp/$Dir.dir ];then
rm -rf /tmp/$Dir.dir
echo "remove direcotry is ok"
else
mkdir /tmp/$Dir.dir
echo " /tmp/$Dir.dir create sucessful."
chmod 750 /tmp/$Dir.dir
fi
done
[root@l
练习3:写一个脚本
使用for循环修改目录/tmp/1.dir,/tmp/2.dir和/tmp/3.dir的最近一次修改时间为2010年3月3号3点3分3秒;
#!/bin/bash
for Dir in 1 2 3;do
if [ -d /tmp/$Dir.dir ];then
touch -m -t 201003030303.03 $Dir
echo "/tmp/$Dir.dir information is: "
stat $Dir
else
echo " connot find directory"
fi
done
练习4:写一个脚本
使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数;
#!/bin/bash
for File in /etc/inittab /etc/fstab /etc/rc.d/rc.sysinit;do
echo "$File has: `grep "^#" $File |wc -l | cut -d' ' -f1` rows"
done
练习5:写一个脚本
使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数;
#!/bin/bash
for File in /etc/inittab /etc/fstab /etc/rc.d/rc.sysinit;do
echo "$File start with "#" has: `grep "^#" $File |wc -l | cut -d' ' -f1` rows""
echo "$File start with "^$" has: `grep "^$" $File |wc -l | cut -d' ' -f1` rows""
done
练习6:写一个脚本
使用for循环分别将/proc/cpuinfo、/proc/meminfo、/proc/uptime三个文件中的所有小写字符显示为大写;
#!/bin/bash
for File in /proc/cpuinfo /proc/meminfo /proc/uptime;do
echo "$File `tr 'a-z' 'A-Z' < $File`"
done
练习7:写一个脚本
使用for循环显示用户user1、user2和user3各自的id号;
#!/bin/bash
for User in `seq 1 3`;do
useradd user$User
ID=`grep "\<user$User\>" /etc/passwd | cut -d: -f3`
echo "user$User id is $ID"
done
练习8:写一个脚本
使用for循环分别统计/usr、/var、/bin、/sbin目录下各自的文件个数;
#!/bin/bash
for File in /usr /var /bin /sbin;do
echo "$File has:`ls $File| wc -l` files"
done
练习9:写一个脚本
使用for循环,分别将user1、user2和user3加入到testgrp组中,以其为额外组;
#!/bin/bash
if [ testgrp == `grep "\<testgrp\>" /etc/group | cut -d: -f1` ];then
groupdel testgrp
else
groupadd testgrp
echo "Add group sucessful"
fi
for User in `seq 1 3`;do
usermod -G testgrp user$User
echo "user$User is add testgrp"
done
练习10:写一个脚本
使用for循环,将"Hello Linux.","Hello www.magedu.com ", "GNU is Not Unix."三行内容添加至/tmp/test.txt文件;
添加完成后,显示/tmp/test.txt文件的内容;
#!/bin/bash
for State in "Hello Linux." "Hello www.magedu.com ." "GUN is Not Unix.";do
echo "$State" >> /tmp/test.txt
done
echo -e "/tmp/test.txt :\n`cat /tmp/test.txt`"
练习11:写一个脚本
使用for循环,复制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目录中,并重命名为原有的名称
之后加当前日期,如第一个文件为/tmp/fstab-2013-07-15;
#!/bin/bash
for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions;do
Basename=`basename $File`
Date=`date +%F`
cp $File /tmp/$Basename-$Date
ls -l /tmp | grep "$Basename-$Date"
done
练习12:写一个脚本
显示当前系统上所有默认shell为/bin/bash的用户名、ID号及其在/etc/passwd文件中的行号;
显示格式为:行号:ID:用户
练习13:写一个脚本
显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和shell;
练习14:写一个脚本
显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和基本组的组名;
练习15:写一个脚本::
a)设定变量FILE的值为/etc/passwd
b)依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如: Hello, root, your shell: /bin/bash
c)统计一共有多少个用户
练习16:写一个脚本:
1、添加10个用户user1到user10,密码同用户名;统计这10个用户的ID号之和;
2、写一个脚本,分别显示当前系统上所有默认shell为bash的用户和默认shell为/sbin/nologin的用户,并统计各类shell下的用户总数。显示结果形如:
BASH,3users,they are:
root,redhat,gentoo
NOLOGIN, 2users, they are:
bin,ftp
#!/bin/bash
Shell=`grep "$1\>" /etc/passwd | cut -d: -f7 | uniq`
if [ $Shell == "/bin/bash" ] &> /dev/null;then
num=`grep "$1\>" /etc/passwd | cut -d: -f1 |wc -l`
echo "BASH,$num"users",they are:"
User=`grep "$1\>" /etc/passwd | cut -d: -f1`
for Name in $User;do
echo -n "$Name,"
done
elif [ $Shell == "/sbin/nologin" ] &> /dev/null;then
num=`grep "$1\>" /etc/passwd | cut -d: -f1 |wc -l`
echo "NOLOGIN,$num"users",they are:"
User=`grep "$1\>" /etc/passwd | cut -d: -f1`
for Name in $User;do
echo -n "$Name,"
done
else
echo -n "no $1 shell"
fi
echo
if条件语句和for循序语句的综合练习
1、练习:写一个脚本:
如果指定的用户存,先说明其已经存在,并显示其ID号和SHELL;否则,就添加用户,并显示其ID号;
2、练习:写一个脚本,实现如下功能:
如果设备/dev/sda3已经挂载,就显示其挂载点;否则,就说明其未挂载或设备不存在;
#!/bin/bash
#
Device='/dev/sda3'
if mount | grep "^$Device" &> /dev/null; then
mount | grep "/dev/sda3" | cut -d' ' -f3
else
echo "$Device not mounted or not exist."
fi
3、练习:写一个脚本,生成两个随机数,比较其大小;显示大数;
#!/bin/bash
#
A=$RANDOM
B=$RANDOM
if [ $A -ge $B ]; then
echo "Max number is $A."
else
echo "Max number is $B."
fi
4、练习:写一脚本,随机生成一个整数,判定,显示其奇偶性;
#!/bin/bash
#
A=$RANDOM
if [ $[$A%2] -eq 0 ]; then
echo "$A: Even"
else
echo "$A: Odd"
fi
5、练习:给定一个用户,如果其ID号大于499,就说明其是普通用户,否则,就说明其是管理员或系统用户;
#!/bin/bash
#
UserName=daemon
Uid=`id -u $UserName`
if [ $Uid -gt 499 ]; then
echo "A common user: $UserName."
else
echo "admin user or system user: $UserName."
fi
6、练习:求200以内所有为3的整数倍的整数之和;
#!/bin/bash
#
Sum=0
for I in {1..200}; do
if [ $[$I%3] -eq 0 ]; then
Sum=$[$Sum+$I]
fi
done
echo "Sum: $Sum."
7、练习:给定一个用户,如果其UID等于GID,就说明这是个"good guy",否则,"Bad guy."
#!/bin/bash
#
UserName=user1
if [ `id -u $UserName` -eq `id -g $UserName` ]; then
echo "Good Guy."
else
echo "Bad Guy."
fi
8、写一个脚本:
计算100以内所有奇数的和以及所有偶数的和;分别显示之;
#!/bin/bash
#
EvenSum=0
OddSum=0
for I in {1..100}; do
if [ $[$I%2] -eq 0 ]; then
EvenSum=$[$EvenSum+$I]
else
OddSum=$[$OddSum+$I]
fi
done
echo "EvenSum is: $EvenSum. OddSum is: $OddSum."
9、写一个脚本:
计算N以内所有奇数的和以及所有偶数的和;分别显示之;N是通过参数传递过来的正整数;
#!/bin/bash
#
EvenSum=0
OddSum=0
for I in `seq 1 $1`;do
if [ $[$I%2] -eq 1 ]; then
OddSum=$[$OddSum+$I]
else
EvenSum=$[$EvenSum+$I]
fi
done
echo "EvenSum: $EvenSum."
echo "OddSUm: $OddSum."
echo "Sum: $[$EvenSum+$OddSum]"
10、练习:通过参数传递n个正整数给脚本,求其和;
#!/bin/bash
#
Sum=0
for I in `seq 1 $#`; do
Sum=$[$Sum+$1]
shift
done
echo $Sum
11、练习,写一个脚本,完成以下要求:
1、添加10个用户user1, user2, ..., user10;但要先判断用户是否存在,不存在而后再添加;
2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
3、最后显示当前系统上共有多少个用户;
#!/bin/bash
#
Count=0
for I in {1..10}; do
if id user$I &> /dev/null; then
echo "user$I exists."
else
useradd user$I
echo "Add user$I successfully."
Count=$[$Count+1]
fi
done
echo "Add $Count new users."
echo "Total users: `wc -l /etc/passwd | cut -d' ' -f1`."
12、练习,写一个脚本,完成以下要求:
1、通过参数传递一系列用户名给脚本,让脚本添加这些用户;但要先判断用户是否存在,不存在而后再添加;
2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
13、练习,写一个脚本,完成以下要求:
给定一个用户:
1、如果其UID为0,就显示此为管理员;
2、否则,就显示其为普通用户;
14、练习:写一个脚本,完成以下要求:
通过参数传递一个磁盘设备文件给脚本,让脚本来判断其是否有扩展分区;有则显示有,否则显示为无;
15、练习:写一个脚本
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
16、练习:写一个脚本;(要求:不使用id命令获得其id号;)
给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为"good guy";否则,就显示此用户为"bad guy"。
17、练习:写一个脚本
给脚本传递两个参数(整数);
显示此两者之和,之乘积;
18、写一个脚本,分别显示当前系统上所有默认shell为bash的用户和默认shell为/sbin/nologin的用户,并统计各类shell下的用户总数。显示结果形如:
BASH,3users,they are:
root,redhat,gentoo
NOLOGIN, 2users, they are:
bin,ftp
#!/bin/bash
Shell=`grep "$1\>" /etc/passwd | cut -d: -f7 | uniq`
if [ $Shell == "/bin/bash" ] &> /dev/null;then
num=`grep "$1\>" /etc/passwd | cut -d: -f1 |wc -l`
echo "BASH,$num"users",they are:"
User=`grep "$1\>" /etc/passwd | cut -d: -f1`
for Name in $User;do
echo -n "$Name,"
done
elif [ $Shell == "/sbin/nologin" ] &> /dev/null;then
num=`grep "$1\>" /etc/passwd | cut -d: -f1 |wc -l`
echo "NOLOGIN,$num"users",they are:"
User=`grep "$1\>" /etc/passwd | cut -d: -f1`
for Name in $User;do
echo -n "$Name,"
done
else
echo -n "no $1 shell"
fi
echo
执行 sh shell.sh bash
写一个脚本:可以接受一个参数,其使用形式如下:
script.sh {start|stop|restart|status}
如果参数为start,创建空文件/var/lock/subsys/script,并显示"Starting script successfully.";
如果参数为stop,则删除文件/var/lock/subsys/script,并显示"Stop script finished.";
如果参数为restart,则删除文件/var/lock/subsys/script后重新创建,并显示"Restarting script successfully.";
如果参数为status,那么:
如果/var/lock/subsys/script文件存在,则显示为"script is running."
否则,则显示为"script is stopped."
其它任何参数:则显示"script.sh {start|stop|restart|status}"
进一步:修改start的机制为:
如果参数为start,且/var/lock/subsys/script文件不存在,则创建空文件/var/lock/subsys/script,并显示"Starting script successfully.";
否则,显示"script is already running."
进一步:修改stop的机制为:
如果参数为stop,且/var/lock/subsys/script文件存在,则删除文件/var/lock/subsys/script,并显示"Stop script finished.";
否则,显示"script is stopped yet."
version1.sh
#!/bin/bash
#Author:litaotao
dir=`basename $0`
if [ $1 == "start" ];then
touch /var/lock/subsys/$dir
echo "Starting script successfully."
elif [ $1 == "stop" ];then
rm /var/lock/subsys/$dir &> /dev/null
echo "Stop script finished."
elif [ $1 == "restart" ];then
rm /var/lock/subsys/$dir &> /dev/null
touch /var/lock/subsys/$dir
echo "Restarting script sucessfully."
elif [ $1 == "status" ];then
if [ -e /var/lock/subsys/$dir ];then
echo "script is running."
else
echo "script is stopped."
fi
else
echo "$dir.sh {statr|stop|restart|status}"
fi
version2.sh
#!/bin/bash
#Author:litaotao
dir=`basename $0`
if [ $1 == "start" ];then
if [ -e /var/lock/subsys/$dir ];then
echo "script is already running."
else
touch /var/lock/subsys/$dir
echo "Starting script sucessfully."
fi
elif [ $1 == "stop" ];then
rm /var/lock/subsys/$dir &> /dev/null
echo "Stop script finished."
elif [ $1 == "restart" ];then
rm /var/lock/subsys/$dir &> /dev/null
touch /var/lock/subsys/$dir
echo "Restarting script sucessfully."
elif [ $1 == "status" ];then
if [ -e /var/lock/subsys/$dir ];then
echo "script is running."
else
echo "script is stopped."
fi
else
echo "$dir.sh {statr|stop|restart|status}"
fi
version3.sh
#!/bin/bash
#Author:litaotao
dir=`basename $0`
if [ $1 == "start" ];then
if [ -e /var/lock/subsys/$dir ];then
echo "script is already running."
else
touch /var/lock/subsys/$dir
echo "Starting script sucessfully."
fi
elif [ $1 == "stop" ];then
if [ -e /var/lock/subsys/$dir ];then
rm /var/lock/subsys/$dir &> /dev/null
echo "Stop script finished."
else
echo "script is stopped yet."
fi
elif [ $1 == "restart" ];then
rm /var/lock/subsys/$dir &> /dev/null
touch /var/lock/subsys/$dir
echo "Restarting script sucessfully."
elif [ $1 == "status" ];then
if [ -e /var/lock/subsys/$dir ];then
echo "script is running."
else
echo "script is stopped."
fi
else
echo "$dir.sh {statr|stop|restart|status}"
fi
标签:脚本,bin,shell,script,echo,etc,bash,dir From: https://www.cnblogs.com/smoke520/p/18351735