两台虚拟机,均要检测
1. Yum是否可用
2. ?防火墙默认区域修改为trusted
3. IP地址是否配置
#######################################################
二、普通用户(必须还原环境)
??
? ? ?客户端普通用户访问服务端nfs-server服务,
? ? ?服务端会以客户端相同UID身份的本地用户进行权限判定
? ? LDAP : ?网络用户,提供用户名
? ? kerberos : 密码验证,实现“一次密码认证,多次免密登录”的通行证机制
1.两台虚拟机都运行脚本,加入LDAP与kerberos
??
? # lab nfskrb5 setup
2.服务端修改配置文件,创建读写的共享
[[email protected] ~]# mkdir /test
[[email protected] ~]# vim /etc/exports
? ?/test ?*(rw,sec=krb5p)
3.服务端部署加密的密钥
# wget http://172.25.254.254/pub/keytabs/server0.keytab ?-O /etc/krb5.keytab
# ls ?/etc/krb5.keytab
4.服务端 重起 nfs-server 与 nfs-secure-server?
# systemctl restart ?nfs-server ?nfs-secure-server?
5.服务端保证ldapuser0用户有写权限,设置本地权限
[[email protected] ~]# setfacl -m u:ldapuser0:rwx /test
[[email protected] ~]# getfacl /test
6.客户端访问与挂载共享
[[email protected] ~]# showmount -e 172.25.0.11
[[email protected] ~]# mkdir /mnt/nfs
[[email protected] ~]# vim /etc/fstab?
?172.25.0.11:/test ?/mnt/nfs ?nfs ?_netdev,sec=krb5p ?0 ?0
7.客户端部署密钥文件,重起相关的服务
# wget http://172.25.254.254/pub/keytabs/desktop0.keytab ?-O /etc/krb5.keytab
# systemctl restart nfs nfs-secure
8.客户端验证挂载,写入(必须采用ssh方式,su不经过kerberos验证)
[[email protected] ~]# mount -a
[[email protected] ~]# df -h
[[email protected] ~]# ssh [email protected]
[[email protected] ~]$ cd /mnt/nfs/
[[email protected] nfs]$ touch 1.txt
[[email protected] nfs]$ ls
1.txt
[[email protected] nfs]$ exit
########################################################
?Shell脚本
? ? ?脚本:可以执行文件,运行后可以实现某种功能(命令的堆积,非交互)
规范Shell脚本的一般组成
? #! 环境声明(Sha-Bang)
? # 注释文本
? 可执行代码
一、书写第一脚本程序
[[email protected] ~]# vim /root/1.sh?
?#!/bin/bash
?echo hello world
?hostname
?cat ?/etc/redhat-release
?ifconfig | head -2 ?| tail -1
[[email protected] ~]# /root/1.sh
二、书写为Server0自动搭建Yum的脚本
[[email protected] ~]# vim /root/yum.sh?
?#!/bin/bash
?da
[[email protected] ~]# chmod +x /root/yum.sh
[[email protected] ~]# /root/yum.sh
管道传递
? 使用 | 管道操作
– 将前一条命令的标准输出交给后一条命令处理
三、重定向输出
? ? >:只收集前面命令的正确输出
? ? 2>:只收集前面命令的错误输出
? ? &>:收集前面命令的错误与正确输出
[[email protected] ~]# echo 123 > /opt/1.txt
[[email protected] ~]# cat /opt/1.txt
[[email protected] ~]# cat /opt/1.txt /etc/
[[email protected] ~]# cat /opt/1.txt /etc/ > /opt/a.txt
[[email protected] ~]# cat /opt/a.txt
[[email protected] ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt
[[email protected] ~]# cat /opt/a.txt
[[email protected] ~]# cat /opt/1.txt /etc/ &> /opt/a.txt
[[email protected] ~]# cat /opt/a.txt
######################################################
三、书写创建用户并设置密码的脚本
? ? ?/dev/null ?#Linux黑洞设备,专用于收集不要的输出结果
[[email protected] ~]# vim /root/user.sh
?#!/bin/bash
?useradd test06 &> /dev/null
?echo test06创建成功
?echo 123 | passwd --stdin test06 &> /dev/null
?echo test06密码设置成功
[[email protected] ~]# ?chmod +x /root/user.sh
[[email protected] ~]# /root/user.sh
??
? ?变量:为了增加脚本的适用环境的能力,增加脚本的灵活度,方便。-----------引进变量
? ?变量: 容器,以不变的名称,储存变化的值
? ? ? 变量名=变化的值
? 使用变量: ? ?$变量名
? ?为了降低脚本使用难度,可以产生交互
? read ? :可以产生交互,将键盘输入的内容赋值给变量
[[email protected] ~]# vim /root/user.sh
?#!/bin/bash
?read ?-p ?‘请输入您要建立的用户:‘ ? user
?read ?-p ?‘请输入您要设置的密码:‘ ? pass
?useradd ?$user ?&> /dev/null
?echo $user创建成功
?echo $pass | passwd --stdin $user &> /dev/null
?echo $user密码设置成功
[[email protected] ~]# /root/user.sh
#########################################################
什么是变量
? 以不变的名称存放的可能会变化的值
– 变量名=变量值
– 方便以固定名称重复使用某个值
– 提高对任务需求、运行环境变化的适应能力
? 设置变量时的注意事项
– 若指定的变量名已存在,相当于为此变量重新赋值
– 等号两边不要有空格
– 变量名由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符
? 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}
?变量的种类
位置变量
? 在执行脚本时提供的命令行参数(非交互式传值)
[[email protected] ~]# vim ?/root/2.sh
?#!/bin/bash
?echo $1
?echo $2
?echo $3
?echo ${10}
?echo ${11}
# /root/2.sh haha ?benniu ?xixi ?hehe ? lele ? dc ?tc ? dz ? tz 100 200
[[email protected] ~]# vim /root/3.sh
? #!/bin/bash
? cat -n $1 ?| ?head -$2?
[[email protected] ~]# /root/3.sh /etc/passwd ? 2
[[email protected] ~]# /root/3.sh /etc/passwd ? 3
?预定义变量
? ? 用来保存脚本程序的执行信息
– 直接使用这些变量
– 不能直接为这些变量赋值
? $# ?已加载的位置变量的个数
$* ?所有位置变量的值
$? ?程序退出后的状态值,0表示正常,其他值异常
[[email protected] ~]# vim /root/2.sh?
?#!/bin/bash
?echo $1
?echo $2
?echo $3
?echo ${10}
?echo ${11}
?echo $#
?echo $*
[[email protected] ~]# /root/2.sh ?1 ?2 3 4 5 6 7 8 9 10 11
########################################################
?运算?
??
[[email protected] ~]# expr 10 / 3
[[email protected] ~]# expr 10 \* 3
[[email protected] ~]# expr 1 + 2
[[email protected] ~]# expr 3 - 1
[[email protected] ~]# expr 10 ?% ?3 ? ?#取余数 运算
? $() :将命令的输出结果,作为参数
[[email protected] opt]# date
[[email protected] opt]# date +%F
[[email protected] opt]# cd /opt
[[email protected] opt]# mkdir ? $(date +%F)
[[email protected] opt]# ls
[[email protected] opt]# mkdir ? mydir-$(date +%F)
[[email protected] opt]# ls
[[email protected] opt]# mkdir ? MariaDB-$(date +%F)
[[email protected] opt]# ls
[[email protected] opt]# mkdir ? $(hostname)-$(date +%F)
#######################################################
常用的测试选项
? 检查文件状态
-e:文档存在为真
-d:文档存在且为目录为真
-f:文档存在且为文件为真
-r:文档存在且有读取权限为真
-w:文档存在且有写入权限为真
-x:文档存在且有执行权限为真
? 比较整数大小(带e都有等于二字,g代表大于,l代表小于)---------只对于数字而言
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
? 字符串比对
== :相等
!=:不相等
########################################################
?if [ 条件测试 ] ; then
? ? ?命令序列xx
?else
? ? ?命令序列yy
?fi
[[email protected] /]# vim ?/root/5.sh
?#!/bin/bash
?if ?[ $1 -eq $2 ];then
? ?echo hello
?else
? ?echo hi
?fi
[[email protected] /]# /root/5.sh ?1 1?
[[email protected] /]# /root/5.sh ?1 2
? ?请书写一个脚本:
? ? ? 用户输入一个IP地址(read),判断是否可以与该IP地址通信,
? ?能通则输出 "IP ok" ? 否则 输出 "IP no"
[[email protected] /]# vim ?/root/6.sh
? ?#!/bin/bash
? ?read ?-p ?‘请输入一个IP地址:‘ ? ?ip
? ?ping ?-c ?2 ?$ip ?&> /dev/null
? ? ?if [ $? -eq 0 ];then
? ? ? ? ? echo ?${ip} ok
? ? ? else
? ? ? ? ? echo ?${ip} no?
? ? ?fi?
[[email protected] /]# ? /root/6.sh
######################################################
?if [条件测试1] ; then
? ? ? 命令序列xx
?elif [条件测试2] ; then
? ? ? 命令序列yy
?else
? ? ? 命令序列zz
?fi
??
? ? ?
? ? 成绩 ? ?大于等于90 ? ?优秀
?大于等于80 ? ?良好 ? ? ? ? ? ??
?大于等于70 ? ?及格 ?
?大于等于60 ? ?仍需努力 ?
?60以下 ? ? ? ? ?在牛的肖邦,也弹不出哥忧伤
[[email protected] ~]# vim /root/8.sh
#!/bin/bash
?read -p ?‘请输入您的成绩:‘ ? ? num
if [ $num -gt ?100 ];then
? ? ?echo 成绩有误
? elif [ $num -lt 0 ];then
? ? ?echo 成绩有误
? elif [ $num -ge 90 ];then
? ? ?echo 优秀
? elif [ $num -ge 80 ];then
? ? ?echo 良好
? elif [ $num -ge 70 ];then
? ? ?echo 及格
? elif [ $num -ge 60 ];then
? ? ?echo 仍需努力
? else?
? ? echo 在牛的肖邦,也弹不出哥忧伤
fi
#####################################################
在 server0 上创建 /root/foo.sh 脚本
1)当运行/root/foo.sh redhat,输出为fedora
2)当运行/root/foo.sh fedora,输出为redhat
3)当没有任何参数或者参数不是 redhat 或者
fedora时,其错误输出产生以下信息:?
? /root/foo.sh ?redhat|fedora
? ? ?‘ ‘:把所有的特殊字符,当作普通文本字符输出
[[email protected] ~]# vim ?/root/foo.sh
?#!/bin/bash
?if [ ?$1 ?== ?redhat ?];then
? ?echo ?fedora
?elif [ ?$1 ?== ?fedora ?];then
? ?echo ?redhat
?else
? ?echo ?‘/root/foo.sh ?redhat|fedora‘
?fi
[[email protected] ~]# /root/foo.sh redhat
[[email protected] ~]# /root/foo.sh fedora
[[email protected] ~]# /root/foo.sh haha
?#!/bin/bash
?if [ $# -eq 0 ];then
? ?echo ‘/root/foo.sh ?redhat|fedora‘
? elif [ $1 == redhat ];then
? ?echo fedora
? elif [ $1 == fedora ];then
? ?echo redhat
?else
? ?echo ‘/root/foo.sh ?redhat|fedora‘
?fi
? ? ??
? ? ? ?" ":可以将 “没有” 变成 “ 空值”
? ? ? ?" " 要使==他们两相等,在" "中间必须要有添加东西,否则" "和==不相等,列如"$1" == redhat?
?#!/bin/bash
?if [ ?"$1" == redhat ];then
? ?echo fedora
? elif [ "$1" == fedora ];then
? ?echo redhat
?else
? ?echo ‘/root/foo.sh ?redhat|fedora‘ ?>&2 ? #将正确输出变成错误
? ?exit 2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #脚本退出返回值
?fi
补充:echo ‘/root/foo.sh ?redhat|fedora‘ ?>&2-----本来echo‘ ‘里面跟的东西是错误的但是Linux不知道输出来的东西是错的,所以要想变成错误输出在后面跟上 >&2,这样就可以把错误的信息输出来。然后在添加一个返回值,exit 1,这样就知道是错误还是正确
####################################################
?for循环结构
? 循环结构:将反复执行的语句,循环去执行
? for 变量名 in ? 值列表
? do
? ? ? ? 命令序列
? done
[[email protected] /]# vim ?/root/for.sh
? #!/bin/bash
? for a in 1 2 3 4 5
? do
? ? useradd nsd$a
? ? echo nsd$a创建成功
? done
[[email protected] /]# vim ?/root/for02.sh
? #!/bin/bash
? for a in 1 2 3 4 5
? do
? ? ? echo hello
? done
######################################################
案例5:编写一个批量添加用户脚本
? ? ? ? ? ?在 server0 上创建 /root/batchusers 脚本
1)此脚本要求提供用户名列表文件作为参数
2)如果没有提供参数,此脚本应该给出提示?
? ? ? ?Usage: /root/batchusers,退出并返回相应值
3)如果提供一个不存在的文件,此脚本应该给出提
示 Input file not found,退出并返回相应值
4)新用户的登录Shell为 /bin/false,无需设置密码
5)用户列表测试文件:
http://classroom/pub/materials/userlist
?
# wget http://classroom/pub/materials/userlist?
[[email protected] /]# vim ?/root/batchusers
?#!/bin/bash
?if [ $# -eq 0 ];then
? ? echo ‘Usage: /root/batchusers‘ >&2
? ? exit 1
?fi
?if [ ! -e $1 ];then
? ? echo ‘Input file not found‘ >&2
? ? exit 2
?fi
?for ?a ?in $(cat $1)
?do
? ? useradd -s /bin/false $a
? ? echo $a创建成功
?done
##################################################
?#!/bin/bash
?if [ $# -eq 0 ];then
? ? echo ‘Usage: /root/batchusers‘ >&2
? ? exit 1
?fi
?if [ -e $1 ];then
? ? for ?a ?in $(cat $1)
? ? ?do
? ? useradd -s /bin/false $a
? ? echo $a创建成功
? ? ?done
? else
? ? echo ‘Input file not found‘ >&2
? ? exit 2
?fi
###################################################
#########################################################
? ? ? ? ?
?