练习1:
1、显示当前时间,格式:2016-06-18 10:20:30
date +"%F %T"
2、显示前天星期几
date -d “-2 day” +%w
3、设置当前日期为2019-08-07 06:05:10
date 080706052019.10
练习2:
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
ls /var/l*[[:digit:]][[:lower:]]
2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录
ls /etc/[:digit:][^0-9]
3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录
ls /etc/[^a-Z][a-Z]*
4、显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符的文件或目录
ls -d /etc/rc[0-6]*
5、显示/etc目录下,所有以.d结尾的文件或目录
ls -d /etc/.d
6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
ls -d /etc/[mnrp].conf
7、只显示/root下的隐藏文件和目录
ls -d /root/.*
8、只显示/etc下的非隐藏目录
ls -d /etc/*/
练习3:
1、每天将/etc/目录下所有文件,备份到/data独立的子目录下,并要求子目录格式为backupYYYY-mm-dd,备份过程可见
cp -av /etc/ /data/backupdate +%F
2、创建/data/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权限
cp -a /root/ data/rootdir
cp -r --preserv=mode /root/ data/rootdir
练习4:
(1)如何创建/testdir/dir1/x,/testdir/dir1/y,/testdir/dir1/x/a,/testdir/dir1/x/b,/testdir/dir1/y/a,/testdir/dir1/y/b
mkdir -p /testdir/dir1/x /testdir/dir1/y (错误)
touch /testdir/dirl/x/a /testdir/dir1/x/b /testdir/dir1/y/a /testdir/dirl/y/b(错误)
mkdir -pv /testdir/dir1/{x,y}/{a,b}
(2)如何创建/testdir/dir2/x,/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b
mkdir -p /testdir/dir2/x /testdir/dir2/y
touch /testdir/dir2/x/a /testdir/dir2/x/b
mkdir -pv /testdir/{x,y}/{a,b}
(3)如何创建/testdir/dir3,/testdir/dir4,/testdir/dir5,/testdir/dir5/dir6,/testdir/dir5/dir7
mkdir -p /testdir/dir3 /testdir/dir4 /testdir/dir5
mkdir -p /testdir/dir5/dir6 /testdir/dir5/dir7
练习5:
1、复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的行首的空白字符
2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号
练习6:
1、在vim中设置tab缩进为4个字符
2、复制/etc/rc.d/init.d/functions文件至/tmp目录,替换/tmp/functions文件中的/etc/sysconfig/init为/var/log
3、删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号
练习7:
1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
tr ‘a-z’ ‘A-Z’ < /etc/issue > /tmp/issue.out
2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
who | tr ‘a-z’ ‘A-Z’ > /tmp/who.out
3、一个linux用户给root发邮件,要求邮件标题为"help”,邮件正文如下:
Hello,I am 用户名,The system version is here,please help me to check it,thanks!
操作系统版本信息
echo "Hello,I am whoami
,The system version is here,please help me to check it,thanks!
cat /etc/centos-release
" | mail -s help root
4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开
ll /root | tr “\n” " "
5、计算1+2+3+.+99+100的总和
echo and {1..100}
| bc
seq -s+ 100 | bc
6、删除Windows文本文件中的回车字符,即"r”
tr -d “r” < /data/win.txt
7、处理字符串"xt.,| 1jr#!KaTeX parse error: Expected 'EOF', got '#' at position 61: … " < "xt.,| 1jr#̲!mn 2 c*/fe 3 uz 4"
8、将PATH变量每个目录显示在独立的一行
echo $PATH | tr ‘:’ ‘\n’
9、将指定文件中0-9分别替代成a-j
tr ‘0-9’ ‘a-j’ < /data/linux.txt
10、将文件/etc/centos-release中每个单词(由字母组成)显示在独立一行,并无空行
tr " " “\n” < /etc/centos-release
练习8:
1.创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为
“Gentoo Distribution”
useradd gentoo
usermod -G bin,root gentoo
usermod -c “Gentoo Distribution”
2、创建下面的用户、组和组成员关系
名字为webs的组
groupadd webs
用户nginx,使用webs作为附加组
useradd nginx -G webs
用户varnish,使用webs作为附加组
useradd varnish -G webs
用户mysql,不可交互登录系统,且不是webs的成员,
useradd -s /sbin/nologin mysql
nginx,varnish,mysql密码都是magedu
echo magedu | passwd --stdin nginx
echo magedu | passwd --stdin varnish
echo magedu | passwd --stdin mysql
练习9:
1、当用户docker对/testdir目录无执行权限时,意味着无法做哪些操作?
不能进入/testdir目录、不能创建文件、
2、当用户mongodb对/testdir 目录无读权限时,意味着无法做哪些操作?
不能列出文件名
3、当用户redis 对/testdir 目录无写权限时,该目录下的只读文件file1是否可修改和删除?
不能修改,不能删除
4、当用户zabbix对/testdir目录有写和执行权限时,该目录下的只读文件filel是否可修改和删除?
不能修改,可以删除
5、复制/etc/fstab文件到/var/tmp下,设置文件所有者为tomcat读写权限,所属组为apps组有读写权限,其他人无权限
cp /etc/fstab /var/tmp
chown tomcat.apps /var/tmp/fstab
chmod 660 /var/tmp/fstab
6、误删除了用户git的家目录,请重建并恢复该用户家目录及相应的权限属性
cp -r /etc/skel /home/git
chown git.git /home/git
chmod 700 /home/git
练习10:
1、找出ifconfig"网卡名”命令结果中本机的IPv4地址
ifconfig ens33 | head -2 | tail -1 | tr -s " " | cut -d" " -f3
2、查出分区空间使用率的最大百分比值df
df | tr -s " " $ | cut -d$ -f5 | sort -nr | head -1
3、查出用户UID最大值的用户名、UID及shel类型
getent passwd | sort -t: -k3 -nr | head -1 | cut -d: -f1,3,6
4、查出/tmp的权限,以数字方式显示
ll / | tail -3 | head -1 | cut -d" " -f1 | cut -c 2-10 | tr rwxt 4211
5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
netstat -nt | tr -s " " : | cut -d: -f4 | sort | uniq -c | sort -nr
练习11:
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
cat /proc/meminfo | grep -i ^s
cat /proc/meminfo | grep 1
2、显示/etc/passwd文件中不以/bin/bash结尾的行
getent passwd | grep -v /bin/bash$
3、显示用户rpc默认的shel程序
getent passwd rpc | cut -d: -f7
4、找出/etc/passwd中的两位或三位数
getent passwd | grep -o “<[0-9]{2,3}>”
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
cat /etc/grub2.cfg | grep 2 | grep [3]$
6、找出“netstat-tan"命令结果中以LISTEN后跟任意多个空白字符结尾的行
netstat | grep “<DGRAM[[:space:]]>"
7、显示CentOS7上所有UID小于1000以内的用户名和UID
getent group | cut -d: -f1,3 | grep “<[0-9]{1,3}>”
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shel同名的行
自己:getent passwd | grep -e ^bash -e bash$
正确答案:grep "([:]+):.<\1$” /etc/passwd
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
自己: df | tr -s " " | cut -d" " -f5 | grep [0-9] | sort -nr |tr -d %
老师:df | grep /dev/sda | grep -o “[0-9]+%” |tr -d % | sort -nr
练习12:
1、显示三个用户root、mage、wang的UID和默认shell
getent passwd root mage wang | cut -d: -f1,3,7
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
egrep “4.(.)” /etc/rc.d/init.d/functions(错了)
egrep “^([[:alpha:]]+|_).()" /etc/rc.d/init.d/functions
egrep "^.>()” /etc/rc.d/init.d/functions
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo /etc/rc.d/init.d/functions | egrep -o “\b[[:alnum:]]+/$" (看参考答案)
4、使用egrep取出上面路径的目录名
echo /etc/rc.d/init.d/functions | egrep -o "./<” (看参考答案)
5、统计last命令中以root登录的每个主机IP地址登录次数
last root | egrep -o ‘<[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/>’(自己)
last root | egrep -o “([0-9]{1,3}.){3}[0-9]{1,3}” | sort | uniq -c(看参考答案后自己修改)
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
0-9:
echo {0…1000} | egrep -o “<[0-9]{1}>”
10-99
echo {0…1000} | egrep -o “<[0-9]{2}>”
100-199
echo {0…1000} | egrep -o “<^1[0-9]{2}>”(错了)
echo {0…1000} | egrep -o “<1[0-9]{2}>”(正确)
200-249
echo {0…1000} | egrep -o “<2[0-4][0-9]{1}>”
250-255
echo {0…1000} | egrep -o “<25[0-5]{1}>”
7、显示ifconfig命令结果中所有IPv4地址
ifconfig | egrep -o “([0-9]{1,3}.){3}[0-9]{3}”
8、将此字符串:welcome to magedu linux中的每个字符去重并排序,重复次数多的排到前面
echo welcome to magedu linux | grep -o . | egrep [[:space:]] | sort | uniq -c | sort -nr
练习13:
·1、编写脚本systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
vim systeminfo.sh
#!/bin/bash
COLOR="\033[1;31m"
COLOREND="\033[0m"
echo -e “OS Verion is:
C
O
L
O
R
‘
c
a
t
/
e
t
c
/
r
e
d
h
a
t
−
r
e
l
e
a
s
e
‘
COLOR`cat /etc/redhat-release`
COLOR‘cat/etc/redhat−release‘COLOREND”
echo -e “kernel version is:
C
O
L
O
R
‘
u
n
a
m
e
−
r
‘
COLOR`uname -r`
COLOR‘uname−r‘COLOREND”
echo -e “hostname is:
C
O
L
O
R
‘
h
o
s
t
n
a
m
e
‘
COLOR`hostname`
COLOR‘hostname‘COLOREND”
echo -e “IPv4 is: KaTeX parse error: Can't use function '\.' in math mode at position 39: …-o '([0-9]{1,3}\̲.̲){3}[0-9]{1,3}'…COLOREND”
echo -e “CPU type is:
C
O
L
O
R
‘
l
s
c
p
u
∣
g
r
e
p
"
M
o
d
e
l
n
a
m
e
"
∣
c
u
t
−
d
:
−
f
2
∣
t
r
−
s
"
"
‘
COLOR`lscpu | grep "Model name" | cut -d: -f2 | tr -s " "`
COLOR‘lscpu∣grep"Modelname"∣cut−d:−f2∣tr−s""‘COLOREND”
echo -e “Disk space is:
C
O
L
O
R
‘
l
s
b
l
k
∣
g
r
e
p
s
d
a
∣
t
r
−
s
"
"
∣
c
u
t
−
d
"
"
−
f
4
‘
COLOR`lsblk | grep ^sda | tr -s " " | cut -d" " -f4`
COLOR‘lsblk∣grepsda∣tr−s""∣cut−d""−f4‘COLOREND”
echo -e “Memory size is:
C
O
L
O
R
‘
f
r
e
e
−
h
∣
t
r
−
s
"
"
:
∣
g
r
e
p
M
e
m
∣
c
u
t
−
d
:
−
f
2
‘
COLOR`free -h | tr -s " " : | grep Mem | cut -d: -f2`
COLOR‘free−h∣tr−s"":∣grepMem∣cut−d:−f2‘COLOREND”
unset COLOR COLOREND
2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中
vim backup.sh
#!/bin/bash
mkdir /data/backup 2> /dev/null
echo -e “\033[1;31mstart backup!\033[0m”
sleep 2
cp -av /etc/ /data/backup/etcdate +%F
echo -e “\033[1;34mBackup is finished\033[0m”
3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
vim disk.sh
echo -e “disk max is: \033[1;31mdf | grep '/dev/sd' | egrep -o '[0-9]{1,3}%' | sort -nr | hea d -1
\033[0m”
4、编写脚本links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
vim links.sh
#!/bin/bash
echo “links IPv4 is:”
echo -e “\033[1;31mnetstat -nt | grep tcp | tr -s " " : | cut -d: -f6 | uniq
\033[0m”
练习14:
1、QQ egrep -o ‘QQ:[0-9]+>’
2、身份证号 egrep -o ‘<[0-9]{18}>’
3、邮箱 egrep -o ‘<[[:alnum:]]+@[[:alnum:]]+.[[:alnum:]]+>’
4、手机号 egrep -o ‘<[0-9]{11}>’
练习15:
1、编写脚本sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的UID之和
vim sumid.sh
#!/bin/bash
uid_1=10
uid_2=20
Passwd_Id_1=head -$uid_1 /etc/passwd | tail -1 | cut -d: -f3
Passwd_Id_2=head -$uid_2 /etc/passwd | tail -1 | cut -d: -f3
let SUM=
P
a
s
s
w
d
I
d
1
+
Passwd_Id_1+
PasswdId1+Passwd_Id_2
echo “第 $uid_1 行uid为 $Passwd_Id_1”
echo “第 $uid_2 行uid为 $Passwd_Id_2”
echo “合计为 $SUM”
2、编写脚本 sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
vim sumspace.sh
#!/bin/bash
Space_1=/data/f1.txt
Space_2=/data/f2.txt
let Sum1=egrep ^[[:space:]]*$ $Space_1 | uniq -c | tr -s " " | cut -d" " -f2 | tr '\n' +
‘0’
let Sum2=egrep ^[[:space:]]*$ $Space_2 | uniq -c | tr -s " " | cut -d" " -f2 | tr '\n' +
‘0’
let SUM=
S
u
m
1
+
Sum1+
Sum1+Sum2
echo “文件 $Space_1 的空白行有 $Sum1 个”
echo “文件 $Space_2 的空白行有 $Sum2 个”
echo “合计为 $SUM 个空白行”
3、编写脚本 sumfile.sh,统计/etc,/var,/usr目录中共有多少个一级子目录和文件
vim sumfile.sh
#!/bin/bash
Dir_1=/etc
Dir_2=/var
Dir_3=/usr
Sum_1=ls -a $Dir_1 | tr -s " " | uniq -c | tr -s " " | cut -d" " -f2 | tr '\n' +
Sum_2=ls -a $Dir_2 | tr -s " " | uniq -c | tr -s " " | cut -d" " -f2 | tr '\n' +
Sum_3=ls -a $Dir_2 | tr -s " " | uniq -c | tr -s " " | cut -d" " -f2 | tr '\n' +
let sum1=
S
u
m
1
′
0
′
−
2
l
e
t
s
u
m
2
=
Sum_1'0'-2 let sum2=
Sum1′0′−2letsum2=Sum_2’0’-2
let sum3=
S
u
m
3
′
0
′
−
2
e
c
h
o
"
Sum_3'0'-2 echo "
Sum3′0′−2echo"Dir_1 目录中有
s
u
m
1
个
一
级
子
目
录
和
文
件
"
e
c
h
o
"
sum1 个一级子目录和文件" echo "
sum1个一级子目录和文件"echo"Dir_2 目录中有
s
u
m
2
个
一
级
子
目
录
和
文
件
"
e
c
h
o
"
sum2 个一级子目录和文件" echo "
sum2个一级子目录和文件"echo"Dir_3 目录中有 $sum3 个一级子目录和文件"
练习16:
1、编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
vim argsnum.sh
#!/bin/bash
[ $# -lt 1 ] && { echo “至少应该给一个参数,例: basename $0
/xxx/xxx.xxx”; exit 10; }
[ KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ -ge 1 ] && { l… $1 | uniq -c | tr -s " " | cut -d" " -f2 | tr ‘\n’ +'0' && echo "
basename $1` 的空白行数有 $Space 个"; } || { echo " Erorr! "; exit 20; }
2、编写脚本hostping.sh,接受一个主机的IPV4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问"
vim hostping.sh
#!/bin/bash
[ $# -lt 1 ] && { echo “至少应该给一个参数,例: basename $0
255.255.255.255”; exit 10; }
[[ KaTeX parse error: Can't use function '\.' in math mode at position 51: …][0-9]|25[0-5])\̲.̲){3}([1-9]?[0-9… ]] || { echo “该IP地址格式错误”; exit 20; }
ping -c1 -w1 $1 &> /dev/null && echo " 该IP地址可访问。" || echo " 该IP地址不可访问!"
3、编写脚本checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
vim checkdisk.sh
#!/bin/bash
WARNING_1=80
WARNING_2=80
Df_1=df | egrep '/dev/sd' | tr -s " " % | cut -d% -f5 | sort -nr | head -1
Df_2=df -i | egrep '/dev/sd' | tr -s " " % | cut -d% -f5 | sort -nr | head -1
[ “
D
f
1
"
−
g
t
"
Df_1" -gt "
Df1"−gt"WARNING_1” ] && echo “max disk is
D
f
1
[
"
Df_1 % ,空间将满" || echo disk is security [ "
Df1["Df_2” -gt “$WARNING_2” ] && echo “max node is $Df_2 % ,空间将满” || echo disk is security
4、编写脚本per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
vim per.sh
#!/bin/bash
[ $# -lt 1 ] && { echo “至少应该给一个参数,例: basename $0
/xxx/xxx.xxx”; exit 10; }
{ [ -r “$1” -a -w “$1” ]; } && { echo " basename $1
有读写"; exit 20; }
{ [ -r “$1” -o -w “$1” ]; } && { echo " basename $1
有读或写"; exit 30; } || echo " basename $1
不可读并且不可写"
5、编写脚本excute.sh,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
vim excute.sh
#!/bin/bash
[ $# -lt 1 ] && { echo “至少应该给一个参数,例: basename $0
/xxx/xxx.xxx”; exit 10; }
[[ "KaTeX parse error: Can't use function '\.' in math mode at position 5: 1"=~\̲.̲sh ]] || { echo “非为sh后缀的文件”; exit 20; }
[ -f “$1” ] || { echo “非普通文件”; exit 30; }
[[ "KaTeX parse error: Can't use function '\.' in math mode at position 7: 1" = ~\̲.̲sh ]] && [ -f “$1” ] && { chmod ugo+x $1; echo “授予 basename $1
执行权限”; } || { echo “非脚本文件”; exit 40; }
6、编写脚本nologin.sh和login.sh,实现禁止和允许普通用户登录系统
vim nologin.sh
#!/bin/bash
User_id=getent passwd $1 | cut -d: -f3
[ $# -lt 1 ] && { echo "至少应该给一个参数,例: basename $0
xxx "; exit 10; }
[ $User_id -lt 1000 ] &>/dev/null && { echo “该用户非普通用户,不能禁止登录”; exit 20; }
[ $User_id -ge 1000 ] &>/dev/null && { usermod -L $1; echo “该用户为普通用户,已经禁止登录”; } || { echo " 未找到该用户 "; exit 30; }
vim login.sh
#!/bin/bash
User_id=getent passwd $1 | cut -d: -f3
[ $# -lt 1 ] && { echo "至少应该给一个参数,例: basename $0
xxx "; exit 10; }
[ $User_id -lt 1000 ] &>/dev/null && { echo “该用户非普通用户,不能允许登录”; exit 20; }
[ $User_id -ge 1000 ] &>/dev/null && { usermod -U $1; echo “该用户为普通用户,已经允许登录”; } || { echo " 未找到该用户 "; exit 30; }
练习17:
1、编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
vim createuser.sh
#!/bin/bash
read -p “Input user: " USER
if [ -z “$USER” ];then
echo “please input user”
exit 10
elif getent passwd $USER &> /dev/null; then
getent passwd
U
S
E
R
e
c
h
o
"
USER echo "
USERecho"USER already exists”
else
useradd $USER
echo " Created $USER "
fi
2、编写脚本yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
vim yesorno.sh
#!/bin/bash
read -p "Do you agree? (yes or no): " ANSWER
case $ANSWER in
[Yy]|[Yy][Ee][Ss])
echo OK yes
;;
[Nn]|[Nn][Oo])
echo OK no
;;
*)
echo input false
esac
3、编写脚本filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
vim filetype.sh
#!/bin/bash
read -p "Please input file path: " Pash
if [ -z “$Pash” ];then
echo "至少应该给一个参数,例: basename $0
xxx/xxx.xx "
elif [ -f “
P
a
s
h
"
]
;
t
h
e
n
e
c
h
o
"
Pash" ];then echo "
Pash"];thenecho"Pash 是普通文件”
elif [ -d “
P
a
s
h
"
]
;
t
h
e
n
e
c
h
o
"
Pash" ];then echo "
Pash"];thenecho"Pash 是目录文件”
elif [ -h “
P
a
s
h
"
]
;
t
h
e
n
e
c
h
o
"
Pash" ];then echo "
Pash"];thenecho"Pash 是符号链接文件”
elif [ -c “
P
a
s
h
"
]
;
t
h
e
n
e
c
h
o
"
Pash" ];then echo "
Pash"];thenecho"Pash 是字符设备文件”
elif [ -c “
P
a
s
h
"
]
;
t
h
e
n
e
c
h
o
"
Pash" ];then echo "
Pash"];thenecho"Pash 是块设备文件”
elif [ -p “
P
a
s
h
"
]
;
t
h
e
n
e
c
h
o
"
Pash" ];then echo "
Pash"];thenecho"Pash 是命名管道文件”
elif [ -s “
P
a
s
h
"
]
;
t
h
e
n
e
c
h
o
"
Pash" ];then echo "
Pash"];thenecho"Pash 是套接字文件”
else
echo “KaTeX parse error: Expected 'EOF', got '#' at position 73: …m checkint.sh #̲!/bin/bash rea…Number” ];then
echo "请输入一个数字,不能为空 "
elif [[ "
N
u
m
b
e
r
"
=
[
0
−
9
]
+
Number" =~ ^[0-9]+
Number"= [0−9]+ ]];then
echo "OK Input $Number "
else
echo "请输入一个数字,例:10 "
if
练习18:
1、让所有用户的PATH环境变量的值多出一个路径,例如:
/usr/local/apache/bin(修改出错,所有外部命令,无法执行)
vim /etc/profile.d/env.sh
PASH=/usr/local/apache/bin:$PATH
2、用户root登录时,将命令指示符变成红色,并自动启用如下别名:
rm= ‘rm -i’
cdnet= 'cd /etc/sysconfig/network-scripts/"
editnet= ‘vim /etc/sysconfig/network-scripts/ifcfg-etho’
editnet= ‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33’(如果系统是CentOS7)
vim /etc/profile.d/env.sh
PS1=[\e[1;31m][\u@\h \W]$[\e[0m]
vim /etc/bashrc
alias rm=‘rm -i’
alias cdnet=‘cd /etc/sysconfig/network-scripts/’
alias editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-ens33’
3、任意用户登录系统时,显示红色字体的警示提醒信息"Hi,dangerous!"
vim /etc/motd (注意: :在vim中输入Ctrl+V后再按ESC)
^[[1;31;47m Hi,dangerous! ^[[0;37;40m
4、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
vim ~/.vimrc
if expand("%:e") == ‘sh’
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#")
call setline(4,"#Author: wuxingbin")
call setline(5,"#QQ: 936366836")
call setline(6,"#Date: “.strftime(”%Y-%m-%d"))
call setline(7,"#FileName: “.expand(”%"))
call setline(8,"#URL: wxbjs55555@163.com")
call setline(9,"#Description: The test script")
call setline(10,"#Copyright ©: “.strftime(”%Y")." All rights reserved")
call setline(11,"#")
call setline(12,"#")
call setline(13,"#功能:")
call setline(14,“set -u”)
call setline(15,“set -e”)
call setline(16,"")
endif
5、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等
vim reset.sh
#!/bin/bash
echo alias rm=‘rm -i’ >> /etc/bashrc
echo alias cdnet=‘cd /etc/sysconfig/network-scripts/’ >> /etc/bashrc
echo alias editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-ens33’ >> /etc/bashrc
echo PS1=[\e[1;31m][\u@\h \W]$[\e[0m] >> /etc/profile.d/env.sh
echo PASH=/usr/local/apache/bin:$PATH >> /etc/profile.d/env.sh
echo if expand("%:e") == ‘sh’ >> ~/.vimrc
echo call setline(4,"#Author: wuxingbin") >> ~/.vimrc
echo call setline(5,"#QQ: 936366836") >> ~/.vimrc
echo call setline(8,"#URL: wxbjs55555@163.com") >> ~/.vimrc
echo endif >> ~/.vimrc
练习19:
1、查找/var目录下属主为root,且属组为mail的所有文件
find /var -user root -group mail -ls
2、查找/var目录下不属于root、lp、gdm的所有文件
find /var -not -user root -not -user lp -not -user gdm -ls
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
find /var -mtime -7 -not -user root -not -user postfix -ls
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
find / -nouser -nogroup -atime -7 -ls
5、查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc -size +1M -type f | xargs ls -S
6、查找/etc目录下所有用户都没有写权限的文件
find /etc ! -perm /222 -ls
7、查找/etc目录下至少有一类用户没有执行权限的文件
find /etc -not -perm -100 -ls
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
find /etc/init.d -perm -102 -ls
练习20:
1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
sed -r ‘/[[:space:]]/d;/KaTeX parse error: Expected 'EOF', got '#' at position 40: …etc/fstab文件中所有以#̲开头,后面至少跟一个空白字符的…/#&/;’ /etc/fstab
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
echo /etc/fstab | sed -r ‘s@(/.*/)([/]+)/?KaTeX parse error: Undefined control sequence: \1 at position 2: @\̲1̲@' 目录名 echo /e…@\2@’ 基名
6、利用sed 取出ifconfig命令中本机的IPv4地址
ifconfig | sed -nr ‘2s/[0-9]+([0-9.]+) .KaTeX parse error: Undefined control sequence: \1 at position 2: /\̲1̲/p' 7、统计centos安…/\2/’ | sort | uniq -c
ls /run/media/wu/CentOS\ 7\ x86_64/Packages/.rpm | rev | cut -d. -f2 | rev | sort | uniq -c
查看答案后,自己手动修改,并测试验证
8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
egrep -wo "<[[:alpha:]]+>" /etc/init.d/functions | sort | uniq -c | sort -n
sed -r 's/[5]+/\n/g’ /etc/init.d/functions | sed -r ‘/6*$/d’ | sort | uniq -c | sort -n
查看答案后,自己手动修改,并测试验证 sed会出现空行统计,需要再次删除空行
9、将文本文件的n和n+1行合并为一行,n为奇数行
sed ‘N;s/\n/ /’
查看答案后,分析,N将读取匹配到的行的下一行追加至模式空间,将换行符,换为空格
练习21:
1、查询命令java来自于哪个rpm包
[root@centos7 ~]#whereis java
java: /usr/bin/java /usr/lib/java /etc/java /usr/share/java /usr/share/man/man1/java.1.gz
方法1: find / -name java
rpm -qf /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.221-2.6.18.1.el7.x86_64/jre/bin/java
java-1.7.0-openjdk-headless-1.7.0.221-2.6.18.1.el7.x86_64
(不对)
方法2:[root@centos7 ~]#yum list | grep java
java-1.7.0-openjdk.x86_64 1:1.7.0.221-2.6.18.1.el7 @anaconda
java-1.7.0-openjdk-headless.x86_64 1:1.7.0.221-2.6.18.1.el7 @anaconda
java-1.8.0-openjdk.x86_64 1:1.8.0.222.b03-1.el7 @anaconda
java-1.8.0-openjdk-headless.x86_64 1:1.8.0.222.b03-1.el7 @anaconda
javapackages-tools.noarch 3.4.1-11.el7 @anaconda
python-javapackages.noarch 3.4.1-11.el7 @anaconda
tzdata-java.noarch 2019b-1.el7 @anaconda
[root@centos7 ~]#rpm -ql tzdata-java.noarch 一个个查
(不对)
方法3:[root@centos7 bin]#ll /usr/bin/java 日是软链接文件
lrwxrwxrwx. 1 root root 22 Apr 20 10:27 /usr/bin/java -> /etc/alternatives/java
[root@centos7 bin]#rpm -qf /etc/alternatives/java(还是不行,再看)
file /etc/alternatives/java is not owned by any package
[root@centos7 bin]#ll /etc/alternatives/java
lrwxrwxrwx. 1 root root 71 Apr 20 10:27 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b03-1.el7.x86_64/jre/bin/java
[root@centos7 bin]#ll /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b03-1.el7.x86_64/jre/bin/java(终于是实际文件了)
-rwxr-xr-x. 1 root root 8760 Aug 8 2019 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b03-1.el7.x86_64/jre/bin/java
[root@centos7 bin]#rpm -qf /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b03-1.el7.x86_64/jre/bin/java
java-1.8.0-openjdk-headless-1.8.0.222.b03-1.el7.x86_64
(找到)
2、yum的配置和使用,包括yum仓库的创建
createrepo [options]
[root@centos7 bin]#cat /etc/yum.repos.d/base.repo
[base]
name=cdrom base
baseurl=file:///misc/cd
https://mirrors.aliyun.com/centos/
r
e
l
e
a
s
e
v
e
r
/
o
s
/
releasever/os/
releasever/os/basearch/
#gpgcheck=0
gpgkey=file:///misc/cd/RPM-GPG-KEY-CentOS-7
[epel]
name=aliyun epel
baseurl=https://mirrors.aliyun.com/epel/
r
e
l
e
a
s
e
v
e
r
/
releasever/
releasever/basearch/
gpgcheck=0
enabled=1
3、编写系统初始化脚本 reset.sh,包括别名,提示符颜色,yum仓库配置文件, 安装tree,ftp,lftp,telnet等包
#!/bin/bash
24 if grep “alias rm=” ~/.bashrc > /dev/null;then
25 echo -e “已经定义别名
C
1
r
m
C1 rm
C1rmC0
C
2
O
K
C2 OK
C2OKC0”
26 else
27 sed -i “/aliases/a alias rm=‘rm -i’” ~/.bashrc > /dev/null && echo -e “
C
2
成
功
定
义
别
名
C2 成功定义别名
C2成功定义别名C0
C
1
r
m
C1 rm
C1rmC0” || exit 10
28 fi
68 if [ -e ~/.vimrc ] && [ -n “grep -o "936366836" ~/.vimrc
” ];then
69 echo -e “
C
1.
v
i
m
r
c
C1 .vimrc
C1.vimrcC0
C
2
已
经
存
在
且
配
置
C2 已经存在且配置
C2已经存在且配置C0”
70 elif [ -e ~/.vimrc ] && [ -z “grep -o "936366836" ~/.vimrc
” ];then
71 echo -e “
C
1.
v
i
m
r
c
C1 .vimrc
C1.vimrcC0
C
3
非
本
人
配
置
,
更
多
命
令
不
在
配
置
C3 非本人配置,更多命令不在配置
C3非本人配置,更多命令不在配置C0 "
72 elif [ ! -e ~/.vimrc ];then
73 (echo -e “
C
2
创
建
配
置
C2 创建配置
C2创建配置C0
C
1.
v
i
m
r
c
C1 .vimrc
C1.vimrcC0”
74 touch ~/.vimrc
75 echo “set tabstop=4” >> ~/.vimrc
76 echo “set softtabstop=4” >> ~/.vimrc
77 echo “set shiftwidth=4” >> ~/.vimrc
78 echo “set ignorecase” >> ~/.vimrc
79 echo “set cursorline” >> ~/.vimrc
80 echo “set autoindent” >> ~/.vimrc
81 echo “set number” >> ~/.vimrc
82 echo “syntax on” >> ~/.vimrc
83 echo ‘autocmd BufNewFile *.sh exec “:call SetTitle()”’ >> ~/.vimrc
84 echo “func SetTitle()” >> ~/.vimrc
85 echo " if expand(”%:e") == ‘sh’" >> ~/.vimrc
86 echo ’ call setline(1,"#!/bin/bash")’ >> ~/.vimrc
87 echo ’ call setline(2,"#")’ >> ~/.vimrc
88 echo ’ call setline(3,"#")’ >> ~/.vimrc
89 echo ’ call setline(4,"#Author: wuxingbin")’ >> ~/.vimrc
90 echo ’ call setline(5,"#QQ: 936366836")’ >> ~/.vimrc
91 echo ’ call setline(6,"#Date: “.strftime(”%Y-%m-%d"))’ >> ~/.vimrc
92 echo ’ call setline(7,"#FileName: “.expand(”%"))’ >> ~/.vimrc
93 echo ’ call setline(8,"#URL: wxbjs55555@163.com")’ >> ~/.vimrc
94 echo ’ call setline(9,"#Description: The test script")’ >> ~/.vimrc
95 echo ’ call setline(10,"#Copyright ©: “.strftime(”%Y")." All rights reserved")’ >> ~/.vimrc
96 echo ’ call setline(11,"#")’ >> ~/.vimrc
97 echo ’ call setline(12,"#")’ >> ~/.vimrc
98 echo ’ call setline(13,"#功能:")’ >> ~/.vimrc
99 echo ’ call setline(14,"#set -u #在扩展一个没有设置的变量时,显示错误信息")’ >> ~/.vimrc
100 echo ’ call setline(15,"#set -e #如果一个命令返回一个非0退出状态值(失败)就退出")’ >> ~/.vimrc
101 echo ’ call setline(16,"")’ >> ~/.vimrc
102 echo ’ endif’ >> ~/.vimrc
103 echo ‘endfunc’ >> ~/.vimrc
104 echo ‘autocmd BufNewFile * normal G’ >> ~/.vimrc
105 echo -e “
C
2
配
置
C2 配置
C2配置C0
C
1.
v
i
m
r
c
C1 .vimrc
C1.vimrcC0
C
2
完
成
C2 完成
C2完成C0”)
106 else
107 exit 40
108 fi
112 if [ id -u
!= 0 ];then
113 echo -e “你的id
C
1
非
r
o
o
t
,
没
有
执
行
权
限
,
不
能
配
置
e
n
v
.
s
h
C1 非root,没有执行权限,不能配置 env.sh
C1非root,没有执行权限,不能配置env.shC0”
114 elif [ id -u
= 0 ] && [ ! -e /etc/profile.d/env.sh ];then
115 (echo -e “
C
2
创
建
配
置
C2 创建配置
C2创建配置C0
C
1
e
n
v
.
s
h
C1 env.sh
C1env.shC0”
116 touch /etc/profile.d/env.sh
117 echo ‘#!/bin/bash’ >> /etc/profile.d/env.sh
118 echo ‘#功能:配置起始环境变量,不能加 set -u 和 set -e ,否则启动后,账号无法登陆’ >> /etc/profile.d/env.sh
119 echo ‘#修改提示符格式’ >> /etc/profile.d/env.sh
120 echo ‘PS1="[\e[1;34m][\u@\h \W]\KaTeX parse error: Undefined control sequence: \[ at position 1: \̲[̲\e[0m\]"' >> /e…PATH’ >> /etc/profile.d/env.sh
127 echo -e “
C
2
配
置
C2 配置
C2配置C0
C
1
e
n
v
.
s
h
C1 env.sh
C1env.shC0
C
2
完
成
C2 完成
C2完成C0”)
128 elif [ id -u
= 0 ] && [ -e /etc/profile.d/env.sh ];then
129 echo -e “
C
1
e
n
v
.
s
h
C1 env.sh
C1env.shC0
C
2
已
经
存
在
,
更
多
命
令
不
在
配
置
C2 已经存在,更多命令不在配置
C2已经存在,更多命令不在配置C0”
130 else
131 exit 40
132 fi
136 if [ id -u
!= 0 ];then
137 echo -e “你的id
C
1
非
r
o
o
t
,
没
有
执
行
权
限
,
不
能
配
置
b
a
s
e
.
r
e
p
o
C1 非root,没有执行权限,不能配置 base.repo
C1非root,没有执行权限,不能配置base.repoC0”
138 elif [ id -u
= 0 ] && [ ! -d /etc/yum.repos.d/bak ];then
139 echo -e “
C
2
新
建
C2 新建
C2新建C0
C
1
b
a
k
C1 bak
C1bakC0
C
2
文
件
夹
C2 文件夹
C2文件夹C0”
140 elif ([ id -u
= 0 ] && [ -e /etc/yum.repos.d/base.repo ]) && [ ls /etc/yum.repos.d/ | wc -l
-le 2 ];then
141 echo -e “
C
1
b
a
s
e
.
r
e
p
o
C1 base.repo
C1base.repoC0
C
2
已
经
存
在
,
不
用
配
置
C2 已经存在,不用配置
C2已经存在,不用配置C0”
142 elif [ id -u
= 0 ] && [ -e /etc/yum.repos.d/.repo ];then
143 (echo -e “开始配置yum源:
C
1
b
a
s
e
.
r
e
p
p
C1 base.repp
C1base.reppC0”
144 mv /etc/yum.repos.d/.repo /etc/yum.repos.d/bak/
145 touch /etc/yum.repos.d/base.repo
146 echo ‘[base]’ >> /etc/yum.repos.d/base.repo
147 echo ‘name=cdrom base’ >> /etc/yum.repos.d/base.repo
148 echo ‘baseurl=file:///misc/cd’ >> /etc/yum.repos.d/base.repo
149 echo ’ https://mirrors.aliyun.com/centos/
r
e
l
e
a
s
e
v
e
r
/
o
s
/
releasever/os/
releasever/os/basearch/’ >> /etc/yum.repos.d/base.repo
150 echo ’ ’ >> /etc/yum.repos.d/base.repo
151 echo ‘[epel]’ >> /etc/yum.repos.d/base.repo
152 echo ‘name=aliyun epel’ >> /etc/yum.repos.d/base.repo
153 echo ‘baseurl=https://mirrors.aliyun.com/epel/
r
e
l
e
a
s
e
v
e
r
/
releasever/
releasever/basearch/’ >> /etc/yum.repos.d/base.repo
154 echo ‘gpgcheck=0’ >> /etc/yum.repos.d/base.repo
155 echo ‘enabled=1’ >> /etc/yum.repos.d/base.repo
156 echo -e “
C
1
b
a
s
e
.
r
e
p
o
C1 base.repo
C1base.repoC0
C
2
配
置
完
成
C2 配置完成
C2配置完成C0”
157 systemctl start autofs
158 systemctl enable autofs)
159 else
160 echo -e “
C
1
创
建
y
u
m
仓
库
,
或
启
动
a
u
t
o
f
s
自
动
挂
载
业
务
失
败
,
请
检
查
C1 创建yum仓库,或启动autofs自动挂载业务失败,请检查
C1创建yum仓库,或启动autofs自动挂载业务失败,请检查C0”
161 exit 40
162 fi
166 if rpm -qi tree &>/dev/null;then
167 echo -e “
C
2
已
经
安
装
C2 已经安装
C2已经安装C0
C
1
t
r
e
e
C1 tree
C1treeC0”
168 else
169 yum install tree -y
170 fi
4、在CentOS 7上编译安装 apache 2.4.25 源码包,并启动此服务
#tar xvf httpd-2.4.25.tar.bz2
#cd /data/httpd-2.4.25
#cat INSTALL
#./configure --help
#./configure --prefix=/apps/httpd2_4_25 --enable-ssl --enable-so
configure: error: APR not found. Please read the documentation.
#yum list | grep apr
#yum install apr-devel
#./configure --prefix=/apps/httpd2_4_25 --enable-ssl --enable-so
configure: error: APR-util not found. Please read the documentation
#yum list | grep apr-util
#yum install apr-util-devel
#./configure --prefix=/apps/httpd2_4_25 --enable-ssl --enable-so
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
#yum list | grep pcre
#yum install pcre-devel
#./configure --prefix=/apps/httpd2_4_25 --enable-ssl --enable-so
checking whether to enable mod_ssl… configure: error: mod_ssl has been requested but can not be built due to prerequisite failures
#yum list | grep mod_ssl
#yum install mod_ssl
#./configure --prefix=/apps/httpd2_4_25 --enable-ssl --enable-so
checking for OpenSSL version >= 0.9.8a… FAILED
#yum list | grep openssl
#yum install openssl-devel
#./configure --prefix=/apps/httpd2_4_25 --enable-ssl --enable-so
#make
#make install
#vim /etc/profile.d/env.sh
#apachectl start
练习 22
1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统 ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载 选项
gdisk /dev/sdb #新建分区为GPT格式
n #创建分区
1 #创建1分区
#默认开始
+2G #大小2G
#默认标签8300
p #查看分配情况
w #保存并退出
y #继续
partprobe /dev/sdb #同步分区表到内存
mkfs.ext4 -b 2048 -L ‘TEXT’ -m 1 /dev/sdb1 #创建ext4文件系统
mkdir /text #创建text文件夹
vim /etc/fstab #编辑/etc/fstab
:r!blkid /dev/sdb1
UUID=138adec8-255d-411f-a474-61e50b5b3ae5 /text ext4 acl 0 0
mount -a #自动挂载
2、写一个脚本,完成如下功能:
(1) 列出当前系统识别到的所有磁盘设备
(2) 如磁盘数量为1,则显示其空间使用信息 否则,则显示最后一个磁盘上的空间使用信息
#!/bin/bash
C1="\033[1;31m" #红颜色开始
C2="\033[1;32m" #绿颜色开始
C3="\033[1;37;41m" #白色字体、红色背景颜色开始
C0="\033[0m" #颜色结束
DiskSum=fdisk -l 2> /dev/null | egrep "^Disk /dev/" | wc -l
#磁盘设备数量和
DiskTail=fdisk -l 2>/dev/null | sed -nr 's@^Disk (/.+/.+): .*@\1@p'| tail -1
#取出最后一个磁盘设备名称
if [
D
i
s
k
S
u
m
−
e
q
1
]
;
t
h
e
n
e
c
h
o
−
e
"
只
有
DiskSum -eq 1 ];then echo -e "只有
DiskSum−eq1];thenecho−e"只有C2 $DiskSum
C
0
个
磁
盘
设
备
"
e
c
h
o
−
e
"
C0 个磁盘设备" echo -e "
C0个磁盘设备"echo−e"C2 $DiskTail $C0 磁盘详情如下"
fdisk -l $DiskTail 2> /dev/null
elif [
D
i
s
k
S
u
m
−
g
t
1
]
;
t
h
e
n
e
c
h
o
−
e
"
共
有
DiskSum -gt 1 ];then echo -e "共有
DiskSum−gt1];thenecho−e"共有C2 $DiskSum
C
0
个
磁
盘
设
备
"
e
c
h
o
−
e
"
最
后
一
个
磁
盘
设
备
:
C0 个磁盘设备" echo -e "最后一个磁盘设备:
C0个磁盘设备"echo−e"最后一个磁盘设备:C2 $DiskTail $C0 磁盘详情如下"
fdisk -l $DiskTail 2> /dev/null
fi
3、将CentOS6的CentOS-6.10-x86_64-bin-DVD1.iso和CentOS-6.10x86_64-bin-DVD2.iso两个文件,合并成一个CentOS-6.10-x86_64Everything.iso文件,并将其配置为yum源
cp -r /misc/cd/* /data/cd/ #拷贝光盘1里的内容到/data/cd/
cp -r /misc/cd/* /data/cd/ #拷贝光盘2里的内容到/data/cd/ 不覆盖TRANS.TB
cat TRANS2.TBL >> TRANS.TBL #将光盘2里的TRANS.TBL内容,追加到光盘1里的TRANS.TBL
cp TRANS.TBL /data/cd/Packages/ #将追加好的TRANS.TBL,拷贝覆盖到/data/cd/Packages/
mount /data/CentOS-6.10-x86_64Everything.iso /mnt/cd #报错 需要是块设备
mount -o loop /data/CentOS-6.10-x86_64Everything.iso /mnt/cd #需要将IOS文件转为loop,才能挂载
vim base.repo #修改yum源文件
baseurl=file:///mnt/cd
gpgkey=file:///mnt/cd/RPM-GPG-KEY-CentOS-6
yum repolist #显示仓库列表
练习 23
1:创建一个可用空间为1G的RAID1设备,文件系统为ext4,有一个空闲盘, 开机可自动挂载至/backup目录
很少用,不用做
2:创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为 256k,文件系统为ext4,开机可自动挂载至/mydata目录
很少用,不用做
练习 24
1、创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小 为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/home目录
gdisk /dev/sdb #创建分区sdb2 大小是10G,文件类型是8e00
n #创建分区
#创建2分区
#默认开始
+10G #大小10G
8e00 #修改标签8e00
p #查看分配情况
w #保存并退出
y #继续
partprobe /dev/sdb #同步分区表到内存
pvcreate /dev/sd{b2,c} #将sdb2和sdc进行pv格式化
pvs #确认PV情况
pvdisplay #确认PV情况
vgcreate -s 16M vg0 /dev/sd{b2,c} #创建卷组
vgs #确认vg情况
vgdisplay #确认vg情况
lvcreate -n testlv -L 5G vg0 #创建逻辑卷
lvs #确认lvm情况
lvdisplay #确认lvm情况
mkfs.xfs /dev/vg0/testlv #创建文件系统
cp -av /home/* /data/backup/
mount /dev/vg0/testlv /home
cp -av /data/backup/* /home/
2、 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至 archlinux用户,复制/etc/pam.d目录至自己的家目录
useradd archlinux
su - archlinux
cp -av /etc/pam.d /home/archlinux/
3、扩展testlv至7G,要求archlinux用户的文件不能丢失
vgdifplay #查看vg0是否还有空间
lvextend -L +2G /dev/vg0/testlv #扩展2G空间
lvgdifplay #查看lvm是否分配2G空间
xfs_growfs /home #同步文件系统
df #确认
du /home/archlinux #确认
4、收缩testlv至3G,要求archlinux用户的文件不能丢失
#必须是ext4文件系统
umount /home #取消挂载
e2fsck /dev/vg0/testlv #先检查磁盘
resize2fs /dev/vg0/testlv 3G #逻辑卷缩减到3G
lvreduce -L 3G /dev/vg0/testlv #文件系统缩减到3G
mount /dev/vg0/testlv /home #挂载
df #确认
du /home/archlinux #确认
5、对testlv创建快照,并尝试基于快照备份数据,验证快照的功能
vgdisplay #确认vg0空间情况
lvcreate -n testlv_snapshot -s -L 1G /dev/vg0/testlv #创建逻辑卷testlv的快照
mount -o ro,nouuid /dev/vg0/testlv_snapshot /mnt/testlv/ #挂载是只读属性,不检查uuid
rm -rf /home/* #删除文件
umount /dev/vg0/testlv_snapshot #取消挂载
umount /dev/vg0/testlv #取消挂载
lvconvert --merge /dev/vg0/testlv_snapshot #恢复
mount /dev/vg0/testlv /home #挂载
du /home #确认
练习 25
1、实验A—R1—R2—R3—B 配置路由,实现:A ping B
A机器—ip:192.168.37.7/24;网关:192.168.37.200;网段:vmnet8 CentOS 7
B机器—ip:172.16.0.8/16;网关:172.16.0.200;网段:vmnet0 桥接 CentOS 8
R1机器—ip1:192.168.37.200/24;网段:vmnet8 CentOS 6
R1机器—ip2:10.0.0.1/8;网段:vmnet6
R2机器—ip1:10.0.0.2/8;网段:vmnet6 CentOS 6v2
R2机器—ip2:20.0.0.1/8;网段:vmnet5
R3机器—ip2:20.0.0.2/8;网段:vmnet5 CentOS 6v3
R3机器—ip2:172.16.0.200/16;网段:vmnet0 桥接
配置:A CentOS 7 网段:vmnet8
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.37.7/24 ipv4.gateway 192.168.37.200
systemctl restart network
ip route add default via 192.168.37.200
配置:B CentOS 8 网段:vmnet0 桥接
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 172.16.0.8/16 ipv4.gateway 172.16.0.200
nmcli connection reload(重新载入配置文件)
nmcli d reapply ens160 重启网卡
配置:R1机器 CentOS 6 网段:vmnet8 vmnet6
cd /etc/sysconfig/network-scripts/
vim ifcfg-eth0
IPADDR=192.168.37.200
PREFIX=24
vim ifcfg-eth1
IPADDR=10.0.0.1
PREFIX=8
chkconfig NetworkManager off
service NetworkManager stop
service network restart
route add -net 20.0.0.0/8 gw 10.0.0.2
route add -net 172.16.0.0./16 gw 10.0.0.2
echo 1 > /proc/sys/net/ipv4/ip_forward
chkconfig iptables off
iptables -F
配置:R2机器 CentOS 6 网段:vmnet6 vmnet5
cd /etc/sysconfig/network-scripts/
vim ifcfg-eth1
IPADDR=10.0.0.2
PREFIX=8
vim ifcfg-eth2
IPADDR=20.0.0.1
PREFIX=8
chkconfig NetworkManager off
service NetworkManager stop
service network restart
route add -net 172.16.0.0/16 gw 20.0.0.2
route add -net 192.168.37.0/24 gw 10.0.0.1
echo 1 > /proc/sys/net/ipv4/ip_forward
chkconfig iptables off
iptables -F
配置:R3机器 CentOS 6 网段:vmnet5 vmnet0
cd /etc/sysconfig/network-scripts/
vim ifcfg-eth1
IPADDR=20.0.0.2(地址写成20.0.0.0了,整了半天才解决)
PREFIX=8
vim ifcfg-eth2
IPADDR=172.16.0.200
PREFIX=16
chkconfig NetworkManager off
service NetworkManager stop
service network restart
route add -net 10.0.0.0/8 gw 20.0.0.1
route add -net 192.168.37.0/24 gw 20.0.0.1
echo 1 > /proc/sys/net/ipv4/ip_forward
chkconfig iptables off
iptables -F
注意:配置双网卡时,将UUID和MAC地址删除,重启网络服务后,路由(route add -net)和转发(/proc/sys/net/ipv4/ip_forward)需要重配:tcpdump -i eth0 -nn imcp 查看eth0和eth1是否收到ping消息,如果是中间路由,是能在2个网卡上看到收发的报文
2、实验A—R1—B 配置桥接,实现:A ping B
A:192.168.37.100 vmnet8 CentOS 7
B:192.168.37.200 vmnet0 CentOS 8
R1:网址dhcp vmnet8 vmnet0 CentOS 6
配置:A:192.168.37.100 vmnet8 CentOS 7
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.37.100/24
nmcli connection reload
systemctl restart network
配置:B:192.168.37.200 vmnet8 CentOS 7
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.37.200/24
nmcli connection reload(重新载入配置文件)
nmcli d reapply ens160 重启网卡
配置:R1:网址dhcp vmnet8 vmnet0 CentOS 6
ifconfig eth0 0.0.0.0
ifconfig eth1 0.0.0.0
brctl addbr br0
brctl addif br0 eth0 ethe1
ifconfig br0 up
配置:R1:网址dhcp vmnet8 vmnet0 CentOS 6
ifconfig eth0 0.0.0.0
ifconfig eth1 0.0.0.0
brctl addbr br0
brctl addif br0 eth0 ethe1
ifconfig br0 up
2.1、实验A—R1—B 配置桥接,实现:A ping B(新方法nmcli)
A:192.168.37.100 vmnet8 CentOS 6
B:192.168.37.200 vmnet0 CentOS 8
R1:网址dhcp vmnet8 vmnet0 CentOS 7
配置:R1:网址dhcp vmnet8 vmnet0 CentOS 7
nmcli connection modify eth0 ipv4.method auto
nmcli connection reload
systemctl restart network
ifconfig eth0 0.0.0.0
ifconfig eth1 0.0.0.0
nmcli connection add con-name mybr0 type bridge ifname br0
nmcli connection add con-name mybr0-eth0 type bridge-slave ifname eth0 master br0
nmcli connection add con-name mybr0-eth1 type bridge-slave ifname eth1 master br0
nmcli connection up mybr0-eth0
nmcli connection up mybr0-eth1
练习 26
1、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间 ?
vim ectbak.sh
mkdir /backup &> /dev/null
tar cpfJ /backup/etcbak-date -d "-1 day" +%F
.tar.xz /etc/ &> /dev/null
chmod +x /data/scripts37/ectbak.sh
crontab -e
30 1 * * 1-5 /data/scripts37/ectbak.sh
2、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至 /tmp/meminfo.txt文件中 ?
vim add_to_meminfo.txt.sh
sed -nr ‘/7/p’ /proc/meminfo >> /tmp/meminfo.txt
chmod +x /data/scripts37/add_to_meminfo.txt.sh
crontab -e
- 2 * * * /data/scripts37/add_to_meminfo.txt.sh
3、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
vim checkdisk.sh
WARING=80
USE=df | sed -nr '/^\/dev\/sd/s@.* ([0-9]+)%.*$@\1@p' | sort -nr | head -1
[ “$USE” -gt $WARING ] && wall disk will be full
chmod +x /data/scripts37/checkdisk.sh
crontab -e
*/10 * * * 1-5 /data/scripts37/checkdisk.sh
练习 27: 用for实现
1、判断/var/目录下所有文件的类型
#!/bin/bash
cd /var/
for file in ls
; do
if [ -f
f
i
l
e
]
;
t
h
e
n
e
c
h
o
"
file ];then echo "
file];thenecho"file 是普通文件"
elif [ -L
f
i
l
e
]
;
t
h
e
n
e
c
h
o
"
file ];then echo "
file];thenecho"file 是链接文件" #注意:必须先判断链接文件,再判断目录(如果链接文件链接的是目录的话)
elif [ -d
f
i
l
e
]
;
t
h
e
n
e
c
h
o
"
file ];then echo "
file];thenecho"file 是目录文件"
else
echo “$file 是其他文件”
fi
done
2、添加10个用户user1-user10,密码为8位随机字符
#!/bin/bash
for i in {1…10} ; do
useradd user$i
PASSWORD=tr -dc ‘[:alnum:]’< /dev/urandom | head -c8
echo
P
A
S
S
W
O
R
D
∣
p
a
s
s
w
d
−
−
s
t
d
i
n
u
s
e
r
PASSWORD | passwd --stdin user
PASSWORD∣passwd−−stdinuseri &> /dev/null
echo user
i
:
i:
i:PASSWORD | tee -a /data/pass.txt &> /dev/null
echo “User: user$i is $PASSWORD”
done
3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以 K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
#!/bin/bash
cd /etc/rc.d/rc3.d
for i in ls
; do
if [ echo $i | head -c1
= K ] ; then
echo “$i stop”
elif [ echo $i | head -c1
= S ] ; then
echo “
i
s
t
a
r
t
"
e
l
s
e
e
c
h
o
"
i start" else echo "
istart"elseecho"i 非K和S开头”
fi
done
4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和
#!/bin/bash
read -p “请输入一个整数:” NUM
sum=0
for i in seq $NUM
; do
let sum=sum+
i
d
o
n
e
e
c
h
o
s
u
m
=
i done echo sum=
idoneechosum=sum
5、计算100以内所有能被3整除的整数之和 ?
#!/bin/bash
num=100
sum=0
for i in seq $num
; do
if [
[
[
[i%3] = 0 ] ; then
let sum=sum+
i
f
i
d
o
n
e
e
c
h
o
s
u
m
=
i fi done echo sum=
ifidoneechosum=sum
6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态 ?
#!/bin/bash
netip=192.168.37
for hostip in {1…254} ; do
{
if ping -c1 -w1
n
e
t
i
p
.
netip.
netip.hostip &> /dev/null ; then
echo
n
e
t
i
p
.
netip.
netip.hostip is up
fi
} &
done
7、打印九九乘法表
#!/bin/bash
8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母, 如:1AbCdeFgH.html
#!/bin/bash
dir=testdir
for (( i=1;i<=10;i++ )) ; do
f=tr -dc ‘[:alpha:]’ < /dev/urandom | head -c 8
touch /
d
i
r
/
dir/
dir/i$f.html
echo “创建文件
i
i
if.html”
done
9、打印等腰三角形 ?
#!/bin/bash
read -p “Please input triangle line number: " LINE
for (( i=1; i<=LINE; i++ ));do
for(( j=0; j<=LINE-i; j++ ));do
echo -e " \c”
done
for(( k=1;k<=i*2-1;k++ ));do
echo -e “+\c”
done
echo
done
10、猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。 到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?
#!/bin/bash
n=1
echo “第 10 天有 1 个桃子”
for (( i=1;i<=9;i++ )) ; do
let n=(n+1)*2
echo “第
[
10
−
[10-
[10−i] 天有 $n 个桃子”
done
echo “最开始的桃子个数: $n”
练习28:用while实现
1、编写脚本,求100以内所有正奇数之和
#!/bin/bash
i=1
sum=0
while [ $i -lt 100 ] ; do
if [
[
[
[i%2] -eq 1 ] ; then
let sum=sum+$i
fi
let i++
done
echo “100以内所有正奇数之和是 $sum”
2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少
#!/bin/bash
read -p “请输入网络地址:” ip
if [[ KaTeX parse error: Can't use function '\.' in math mode at position 52: …][0-9]|25[0-5])\̲.̲){3}([1-9]?[0-9… ]] ; then
netip=echo $ip | sed -rn "s/(.*)\.[0-9]+$/\1/p"
hostip=100
while [ $hostip -lt 103 ] ; do
{
if ping -c1 -w1
n
e
t
i
p
.
netip.
netip.hostip &> /dev/null ; then
echo
n
e
t
i
p
.
netip.
netip.hostip is up
else
echo
n
e
t
i
p
.
netip.
netip.hostip is down
fi
} &
let hostip++
done
wait
exit 0
else
echo “你输入的ip格式错误”
exit 10
fi
3、编写脚本,打印九九乘法表 ?
#!/bin/bash
i=1
while [ $i -le 9 ] ;do
j=1
while [ $j -le
i
]
;
d
o
e
c
h
o
−
e
"
i ] ; do echo -e "
i];doecho−e"{j}x
i
=
{i}=
i=[j*i]\t\c"
let j++
done
echo
let i++
done
4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值
#!/bin/bash
i=1
MAX=
R
A
N
D
O
M
M
I
N
=
RANDOM MIN=
RANDOMMIN=MAX
NUM=10
echo $MAX
while [ $i -lt
N
U
M
]
;
d
o
N
=
NUM ] ; do N=
NUM];doN=RANDOM
echo $N
if [ $N -gt
M
A
X
]
;
t
h
e
n
M
A
X
=
MAX ] ; then MAX=
MAX];thenMAX=N
elif [ $N -lt
M
I
N
]
;
t
h
e
n
M
I
N
=
MIN ] ; then MIN=
MIN];thenMIN=N
fi
let i++
done
echo “MAX=
M
A
X
,
M
I
N
=
MAX , MIN=
MAX,MIN=MIN”
5、编写脚本,实现打印国际象棋棋盘
#!/bin/bash
i=1
while [ $i -le 8 ] ; do
if [
[
[
[i%2] -eq 1 ] ; then
j=1
while [ $j -le 8 ] ; do
if [
[
[
[j%2] -eq 1 ] ; then
echo -e “\033[47m \033[0m\c”
elif [
[
[
[j%2] -eq 0 ] ; then
echo -e “\033[41m \033[0m\c”
fi
let j++
done
echo
elif [
[
[
[i%2] -eq 0 ] ; then
k=1
while [ $k -le 8 ] ; do
if [
[
[
[k%2] -eq 1 ] ; then
echo -e “\033[41m \033[0m\c”
elif [
[
[
[k%2] -eq 0 ] ; then
echo -e “\033[47m \033[0m\c”
fi
let k++
done
echo
fi
let i++
done
#备注:自己完成,代码复杂
6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、 f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令: echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些字符串对应的RANDOM值
#!/bin/bash
echo > md5.txt
str=“efbaf275cd
4be9c40b8b
44b2395c46
f8c8873ce0
b902c16c8b
ad865d2f63”
for i in
s
t
r
d
o
w
h
i
l
e
:
d
o
N
U
M
=
str do while : do NUM=
strdowhile:doNUM=RANDOM
MD5=echo $NUM | md5sum
MD5CUT=echo $MD5 | cut -c1-10
echo $MD5CUT >> md5.txt
if [ $i == $MD5CUT ]
then
echo -e “[ $NUM\t ] =====> [ $MD5 ] =====> [ $MD5CUT ]”
break
fi
done
done
rm -f md5.txt
#查看结果,已经理解,穷尽随机数,进行md5的节段匹配
练习 29
1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录, 则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本
#!/bin/bash
{
hacker=wu
address=/var/log/login.log
while : ; do
USER=who | sed -nr 's@^([[:alnum:]]+) .*@\1@p'
for u in $USER ; do
if [ $u = $hacker ] ; then
echo "hacker $u login TIME date +"%F %T"
" >> $address
exit 0
fi
done
sleep 3
#echo “休息了 3 秒钟”
done
} &
2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出
#!/bin/bash
R=
[
[
[RANDOM%10]
while read -p “猜数字,请输入1个0-9的整数:” NUM ; do
if [[
N
U
M
=
[
[
:
d
i
g
i
t
:
]
]
1
NUM =~ ^[[:digit:]]{1}
NUM= [[:digit:]]1 ]] ; then
if [ $NUM -eq $R ] ; then
echo “猜对了 OK”
break
elif [ $NUM -lt $R ] ; then
echo “猜小了”
else
echo “猜大了”
fi
else
echo “请输入1个0-9的整数”
fi
done
3、用文件名做为参数,统计所有参数文件的总行数
#!/bin/bash
while read -p “请输入文件名:” F ; do
sum=0
for file in $F ; do
ROW=wc -l $file | sed -rn 's#^([[:digit:]]+) .*#\1#p'
echo " $file 的行数为
R
O
W
"
l
e
t
s
u
m
+
=
ROW " let sum+=
ROW"letsum+=ROW
done
break
done
echo “所有文件总行数为:$sum”
exit 0
4、用二个以上的数字为参数,显示其中的最大值和最小值
#!/bin/bash
while read -p “请输入2个以上数字参数:” NUM ; do
if [[
N
U
M
=
[
[
:
d
i
g
i
t
:
]
[
:
s
p
a
c
e
:
]
]
+
NUM =~ ^[[:digit:][:space:]]+
NUM= [[:digit:][:space:]]+ ]] ; then
MAX=echo $NUM | sed -rn 's#^([[:digit:]]+) .*#\1#p'
MIN=$MAX
for i in $NUM ; do
if [ $i -ge
M
I
N
]
;
t
h
e
n
M
A
X
=
MIN ] ; then MAX=
MIN];thenMAX=i
elif [ $i -le
M
A
X
]
;
t
h
e
n
M
I
N
=
MAX ] ; then MIN=
MAX];thenMIN=i
fi
done
echo MIN=
M
I
N
M
A
X
=
MIN MAX=
MINMAX=MAX
break
else
echo “请输入整数字参数”
fi
done
练习 30
1、编写函数,实现OS的版本判断 ?
func_os(){ sed -rn ‘s#.* ([[:digit:]]+)…*#\1#p’ /etc/redhat-release; }
2、编写函数,实现取出当前系统eth0的IP地址 ?
func_eth0(){ ifconfig eth0 | sed -nr ‘2s/[0-9]+([0-9.]+) .*$/\1/p’;}
3、编写函数,实现打印绿色OK和红色FAILED ?
func_ok_failed(){
if [[ $@ =~ faile ]] || [[
@
=
F
A
I
L
E
]
]
;
t
h
e
n
e
c
h
o
−
e
"
@ =~ FAILE ]] ; then echo -e "
@= FAILE]];thenecho−e"@\t [ \033[1;31mFAILED\033[0m ]"
else
echo -e “$@\t [ \033[1;32mOK\033[0m ]”
fi ;
}
4、编写函数,实现判断是否无位置参数,如无参数,提示错误
func_space(){
if [[
@
=
=
"
"
]
]
;
t
h
e
n
e
c
h
o
−
e
"
@ == "" ]]; then echo -e "
@==""]];thenecho−e"@\t [ \033[1;31mFAILED\033[0m ]"
else
echo -e “$@\t [ \033[1;32mOK\033[0m ]”
fi ;
}
练习 31
1、编写服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数:start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功” 考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成” 考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start 考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is running…”,如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped…”
(7)在所有模式下禁止启动该服务,可用chkconfig 和 service命令管理 说明:SCRIPT_NAME为当前脚本名
#!/bin/bash
Address=/data/
CMD_N=SCRIPT_NAME
func_start()
{
if [ -e “
A
d
d
r
e
s
s
Address
AddressCMD_N” ] ; then
echo “$CMD_N 服务已经启动”
else
touch
A
d
d
r
e
s
s
Address
AddressCMD_N
echo “KaTeX parse error: Expected 'EOF', got '}' at position 18: …D_N 服务启动成功" fi }̲ func_stop() { …Address$CMD_N” ] ; then
rm -f
A
d
d
r
e
s
s
Address
AddressCMD_N
echo “
C
M
D
N
服
务
停
止
完
成
"
e
l
s
e
e
c
h
o
"
CMD_N 服务停止完成" else echo "
CMDN服务停止完成"elseecho"CMD_N 服务已经停止”
fi
}
func_restart()
{
if [ -e “
A
d
d
r
e
s
s
Address
AddressCMD_N” ] ; then
rm -f
A
d
d
r
e
s
s
Address
AddressCMD_N
touch
A
d
d
r
e
s
s
Address
AddressCMD_N
echo “$CMD_N 服务重新启动”
else
touch
A
d
d
r
e
s
s
Address
AddressCMD_N
echo “KaTeX parse error: Expected 'EOF', got '}' at position 18: …D_N 服务重新启动" fi }̲ func_status() …Address
C
M
D
N
"
]
;
t
h
e
n
e
c
h
o
"
CMD_N" ] ; then echo "
CMDN"];thenecho"CMD_N 服务运行中”
else
echo “$CMD_N 服务已经停止”
fi
}
if [ $* = start ] &> /dev/null ; then
func_start
exit 0
elif [ $* = stop ] &> /dev/null ; then
func_stop
exit 0
elif [ $* = restart ] &> /dev/null ; then
func_restart
exit 0
elif [ $* = status ] &> /dev/null ; then
func_status
exit 0
else
echo “格式错误”
exit 10
fi
2、编写脚本/root/bin/copycmd.sh
(1) 提示用户输入一个可执行命令名称
(2) 获取此命令所依赖到的所有库文件列表
(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下 如:/bin/bash > /mnt/sysroot/bin/bash /usr/bin/passwd > /mnt/sysroot/usr/bin/passwd
(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下: 如:/lib64/ldlinux-x86-64.so.2 > /mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5) 每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令, 并重复完成上述功能;直到用户输入quit退出
#!/bin/bash
Copy_dir=/data/sysroot
func_mkdir() #创建文件夹
{
CMD_as=which $CMD
CMD_dir=dirname $CMD_as
mkdir -p
C
o
p
y
d
i
r
Copy_dir
CopydirCMD_dir
lis_as=for i in $(ldd $CMD_as);do echo $i;done | grep -o "/.*"
#参考别人答案写出
for k in $lis_as ; do
local lis_dir=dirname $k
mkdir -p
C
o
p
y
d
i
r
Copy_dir
Copydirlis_dir
done
}
func_cp()
{
cp -ap $CMD_as
C
o
p
y
d
i
r
Copy_dir
CopydirCMD_as
echo -e "拷贝 $CMD_as \t=>\t
C
o
p
y
d
i
r
Copy_dir
CopydirCMD_as"
for j in $lis_as ; do
cp -ap $j
C
o
p
y
d
i
r
Copy_dir
Copydirj
echo -e "拷贝 $j \t===>\t
C
o
p
y
d
i
r
Copy_dir
Copydirj"
done
}
while read -p “输入一个可执行命令名称(quit退出):” CMD ; do
if man $CMD &> /dev/null
; then #查看是否是命令
if type $CMD | grep "/" &> /dev/null
; then #查看是否外部命令
func_mkdir
func_cp
else
echo “$CMD 非外部命令,无法拷贝”
sleep 1
fi
elif [ KaTeX parse error: Expected 'EOF', got '&' at position 14: CMD = quit ] &̲> /dev/null ; t…CMD 非命令,无法拷贝"
sleep 1
fi
done
3、编写函数实现两个数字做为参数,返回最大值
func_2num()
{
if [ $1 -lt $2 ] ; then
echo “MIX=$2”
elif [ $1 -gt $2 ] ; then
echo “MIX=$1”
else
echo “格式错误”
fi
}
4、斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、 8、13、21、34、……,斐波纳契数列以如下被以递归的方法定义:F(0)=0, F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2) 利用函数,求n阶斐波那契数列
#!/bin/bash
func_Fibonacci(){
i=$1
if [ $i == 0 ];then
echo 0
elif [ $i -le 2 ];then
echo 1
else
F1=func_Fibonacci $[i-1]
F2=func_Fibonacci $[i-2]
echo $[F1+F2]
fi
}
参考答案已理解
5、汉诺塔(又称河内塔)问题是源于印度一个古老传说。大梵天创造世界的时候做 了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,利用函数,实现N片盘的汉诺塔的移动步骤
#!/bin/bash
step=0
move (){
let step++
echo “$step: move disk $1 $2 -----> $3”
}
hanoi(){
if [ $1 -eq 1 ];then
move $1 $2
4
e
l
s
e
h
a
n
o
i
"
4 else hanoi "
4elsehanoi"[$1-1]" $2 $4 $3
move $1 $2
4
h
a
n
o
i
"
4 hanoi "
4hanoi"[$1-1]" $3 $2 $4
fi
}
read -p "please input the number of plates: " number
hanoi $number A B C
#抄写答案,暂时无法理解
练习 32 数组
1、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
#!/bin/bash
declare -a number
for (( i=0; i<10; i++ ));do
number[
i
]
=
i]=
i]=RANDOM
done
echo “随机数排序:”
echo ${number[@]}
declare -i n=10
for (( i=0; i<n-1; i++ ));do
for (( j=0; j<n-1-i; j++ ));do
let next=$j+1
if (( KaTeX parse error: Expected '}', got 'EOF' at end of input: {number[j]} < KaTeX parse error: Expected '}', got 'EOF' at end of input: {number[next]} ));then
tmp=KaTeX parse error: Expected '}', got 'EOF' at end of input: {number[next]}
number[
n
e
x
t
]
=
next]=
next]={number[KaTeX parse error: Expected 'EOF', got '}' at position 3: j]}̲ nu…j]=$tmp
fi
done
done
echo “排序:”
echo ${number[*]}
echo “最大数是: ${number[0]} 最小数是 KaTeX parse error: Expected '}', got 'EOF' at end of input: {number[(( n-1 ))]}”
#参考答案后,不是很理解
2、将下图所示,实现转置矩阵matrix.sh
1 2 3 1 4 7
4 5 6 => 2 5 8
7 8 9 3 6 9
#!/bin/bash
declare -A matrix
num_rows=3
num_columns=3
matrix=([1,1]=1 [1,2]=2 [1,3]=3 [2,1]=4 [2,2]=5 [2,3]=6 [3,1]=7 [3,2]=8 [3,3]=9)
for ((i=1;i<=num_rows;i++));do
for ((j=1;j<=num_columns;j++));do
echo -e “KaTeX parse error: Expected '}', got 'EOF' at end of input: {matrix[i,KaTeX parse error: Expected 'EOF', got '}' at position 3: j]}̲ \c" done …{matrix[
i
,
i,
i,j]} \c”
done
echo
done
#参考答案后,理解并执行完成
3、打印杨辉三角形
#!/bin/bash
triangle[0]=1
triangleTwo[0]=1 #给数组的第一个元素赋值
flag=true #立flag,用于循环中轮流执行某代码段
echo $triangle #先打印triangle数组的1
#先来用一个5行的杨辉三角形
for ((i=1;i<$1;i++)); do
#利用if else语句来循环轮流执行的代码段
if
f
l
a
g
;
t
h
e
n
n
u
m
b
e
r
s
=
flag; then numbers=
flag;thennumbers={#triangle[]} #把triangle的元素个数取出来,再利用它来进行下面的循环次数
triangleTwo[KaTeX parse error: Expected 'EOF', got '#' at position 12: numbers]=1 #̲给最后一个字符赋值为1 …{numbers};x++));do
triangleTwo[x]=
(
(
t
r
i
a
n
g
l
e
[
((triangle[
((triangle[[x-1]]+triangle[x])) #triangleTwo的值来处于triangle的相邻两位元素
done
echo KaTeX parse error: Expected 'EOF', got '#' at position 18: …riangleTwo[*]} #̲打印triangleTwo数组…{#triangleTwo[]}
triangle[
n
u
m
b
e
r
s
]
=
1
f
o
r
(
(
x
=
1
;
x
<
=
numbers]=1 for ((x=1;x<=
numbers]=1for((x=1;x<={numbers};x++));do
triangle[x]=
(
(
t
r
i
a
n
g
l
e
T
w
o
[
((triangleTwo[
((triangleTwo[[x-1]]+triangleTwo[x]))
done
echo ${triangle[*]}
flag=true
fi
done
#参考答案后,不是很理解