linux系统学习第十一天-<<工程师技术>>-阿里云开发者社区

开发者社区> 开发与运维> 正文

linux系统学习第十一天-<<工程师技术>>

简介:

两台虚拟机,均要检测

1. Yum是否可用
2.  防火墙默认区域修改为trusted
3. IP地址是否配置

#######################################################

 

二、普通用户(必须还原环境)
 
     客户端普通用户访问服务端nfs-server服务,
     服务端会以客户端相同UID身份的本地用户进行权限判定

    LDAP :  网络用户,提供用户名
    kerberos : 密码验证,实现“一次密码认证,多次免密登录”的通行证机制


1.两台虚拟机都运行脚本,加入LDAP与kerberos
 
  # lab nfskrb5 setup

2.服务端修改配置文件,创建读写的共享
[root@server0 ~]# mkdir /test
[root@server0 ~]# 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用户有写权限,设置本地权限
[root@server0 ~]# setfacl -m u:ldapuser0:rwx /test
[root@server0 ~]# getfacl /test

6.客户端访问与挂载共享
[root@desktop0 ~]# showmount -e 172.25.0.11
[root@desktop0 ~]# mkdir /mnt/nfs
[root@desktop0 ~]# 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验证)
[root@desktop0 ~]# mount -a
[root@desktop0 ~]# df -h

[root@desktop0 ~]# ssh  ldapuser0@127.0.0.1

[ldapuser0@desktop0 ~]$ cd /mnt/nfs/
[ldapuser0@desktop0 nfs]$ touch 1.txt
[ldapuser0@desktop0 nfs]$ ls
1.txt
[ldapuser0@desktop0 nfs]$ exit

########################################################
 Shell脚本

     脚本:可以执行文件,运行后可以实现某种功能(命令的堆积,非交互)


规范Shell脚本的一般组成
• #! 环境声明(Sha-Bang)
• # 注释文本
• 可执行代码

 

一、书写第一脚本程序
[root@server0 ~]# vim /root/1.sh

 #!/bin/bash
 echo hello world
 hostname
 cat  /etc/redhat-release
 ifconfig | head -2  | tail -1

[root@server0 ~]# /root/1.sh

二、书写为Server0自动搭建Yum的脚本
[root@server0 ~]# vim /root/yum.sh
 #!/bin/bash
 rm -rf /etc/yum.repos.d/*
 echo '[dvd]
 name=dvd
 baseurl=http://172.25.254.254/content/rhel7.0/x86_64/dvd/
 enabled=1
 gpgcheck=0'  > /etc/yum.repos.d/haha.repo
 yum clean all
 yum repolist

[root@server0 ~]# chmod +x /root/yum.sh
[root@server0 ~]# /root/yum.sh
管道传递
• 使用 | 管道操作
– 将前一条命令的标准输出交给后一条命令处理


三、重定向输出

    >:只收集前面命令的正确输出
    2>:只收集前面命令的错误输出
    &>:收集前面命令的错误与正确输出

[root@server0 ~]# echo 123 > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt

[root@server0 ~]# cat /opt/1.txt /etc/
[root@server0 ~]# cat /opt/1.txt /etc/ > /opt/a.txt
[root@server0 ~]# cat /opt/a.txt

[root@server0 ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt
[root@server0 ~]# cat /opt/a.txt

[root@server0 ~]# cat /opt/1.txt /etc/ &> /opt/a.txt
[root@server0 ~]# cat /opt/a.txt

######################################################
三、书写创建用户并设置密码的脚本
     /dev/null  #Linux黑洞设备,专用于收集不要的输出结果

[root@server0 ~]# vim /root/user.sh

 #!/bin/bash
 useradd test06 &> /dev/null
 echo test06创建成功
 echo 123 | passwd --stdin test06 &> /dev/null
 echo test06密码设置成功

[root@server0 ~]#  chmod +x /root/user.sh
[root@server0 ~]# /root/user.sh
 
   变量:为了增加脚本的适用环境的能力,增加脚本的灵活度,方便。

   变量: 容器,以不变的名称,储存变化的值

      变量名=变化的值

  使用变量:    $变量名


   为了降低脚本使用难度,可以产生交互
  read   :可以产生交互,将键盘输入的内容赋值给变量


[root@server0 ~]# 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密码设置成功

[root@server0 ~]# /root/user.sh

 

 


#########################################################
什么是变量
• 以不变的名称存放的可能会变化的值
– 变量名=变量值
– 方便以固定名称重复使用某个值
– 提高对任务需求、运行环境变化的适应能力


• 设置变量时的注意事项
– 若指定的变量名已存在,相当于为此变量重新赋值
– 等号两边不要有空格
– 变量名由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符


• 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}


 变量的种类

 

位置变量
• 在执行脚本时提供的命令行参数(非交互式传值)

[root@server0 ~]# 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

[root@server0 ~]# vim /root/3.sh
  #!/bin/bash
  cat -n $1  |  head -$2

[root@server0 ~]# /root/3.sh /etc/passwd   2
[root@server0 ~]# /root/3.sh /etc/passwd   3

 

 预定义变量
  • 用来保存脚本程序的执行信息
    – 直接使用这些变量
    – 不能直接为这些变量赋值

     $#  已加载的位置变量的个数
    $*  所有位置变量的值
    $?  程序退出后的状态值,0表示正常,其他值异常

 

[root@server0 ~]# vim /root/2.sh

 #!/bin/bash
 echo $1
 echo $2
 echo $3
 echo ${10}
 echo ${11}
 echo $#
 echo $*

[root@server0 ~]# /root/2.sh  1  2 3 4 5 6 7 8 9 10 11


########################################################
 运算
 
[root@server0 ~]# expr 10 / 3

[root@server0 ~]# expr 10 \* 3

[root@server0 ~]# expr 1 + 2

[root@server0 ~]# expr 3 - 1

[root@server0 ~]# expr 10  %  3    #取余数 运算

  $() :将命令的输出结果,作为参数

[root@server0 opt]# date
[root@server0 opt]# date +%F
[root@server0 opt]# cd /opt

[root@server0 opt]# mkdir   $(date +%F)
[root@server0 opt]# ls
[root@server0 opt]# mkdir   mydir-$(date +%F)
[root@server0 opt]# ls
[root@server0 opt]# mkdir   MariaDB-$(date +%F)
[root@server0 opt]# ls
[root@server0 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

[root@server0 /]# vim  /root/5.sh
 #!/bin/bash
 if  [ $1 -eq $2 ];then
   echo hello
 else
   echo hi
 fi

[root@server0 /]# /root/5.sh  1 1

[root@server0 /]# /root/5.sh  1 2


   请书写一个脚本:
      用户输入一个IP地址(read),判断是否可以与该IP地址通信,
   能通则输出 "IP ok"   否则 输出 "IP no"

[root@server0 /]# 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

[root@server0 /]#   /root/6.sh

######################################################


 if [条件测试1] ; then
      命令序列xx
 elif [条件测试2] ; then
      命令序列yy
 else
      命令序列zz
 fi
 
     
    成绩    大于等于90    优秀
      大于等于80    良好             
      大于等于70    及格  
      大于等于60    仍需努力  
      60以下          在牛的肖邦,也弹不出哥忧伤

 


[root@server0 ~]# 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

 

 

 

     ' ':把所有的特殊字符,当作普通文本字符输出

[root@server0 ~]# 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

[root@server0 ~]# /root/foo.sh redhat
[root@server0 ~]# /root/foo.sh fedora

[root@server0 ~]# /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


      
       " ":可以将 “没有” 变成 “ 空值”


 #!/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

####################################################
 for循环结构

  循环结构:将反复执行的语句,循环去执行


  for 变量名 in   值列表
  do
        命令序列
  done

 


[root@server0 /]# vim  /root/for.sh
  #!/bin/bash
  for a in 1 2 3 4 5
  do
    useradd nsd$a
    echo nsd$a创建成功
  done

[root@server0 /]# 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

[root@server0 /]# 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

###################################################





      本文转自云计算王森 51CTO博客,原文链接:http://blog.51cto.com/13426941/2046194,如需转载请自行联系原作者




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章