Linux shell脚本入门

两台虚拟机,均要检测

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

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

[[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

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

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

[[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

时间: 2024-10-06 06:52:32

Linux shell脚本入门的相关文章

Linux Shell脚本入门--cut命令

Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [[email protected] ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符 [[email protected] ~]# cut -c 字符区间 <==用于排列整齐的信息 选项与参数: -d :后面接分隔字符.与 -f 一起使用: -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思: -c :以字符 (

Linux Shell 脚本入门

linux shell 脚本格式 #!/bin/sh#..... (注释)命令...命令... 使用vi 创建完成之后需设置权限 chmod +x filename.sh 执行命令: ./filename.sh shell 中的局部变量变量的声明,赋值,无需 $ 符号 , 如:myUrl="abc"myVar="asd" 需要注意等号两边不能有空格. 输出变量值echo "myurl:${myUrl}"echo "myvar:${myV

Linux Shell脚本攻略(1.10)

1.10 获取.设置日期和延时 很多应用程序需要以不同的格式打印日期.设置日期和时间.根据日期和时间执行某项操作.延时通常用于在程序执行过程中提供一段等待时间(比如1秒).同样的,我们也能够一多种格式打印日期,或者在命令行中设置日期.在类Unix系统中,日期被存储为一个整数,其大小为自世界标准时间起所流逝的秒数.这种计时方式称为纪元时或Unix时间. 1.10.1 获取.设置时间 以下的程序给出了多种用法: #!/bin/bash start=$(date +%s) #获取纪元时间 date #

Linux Shell脚本攻略(1.8)

1.8 使用别名 linux中的别名就相当于windows中的快捷方式,使用别名可以省去用户输入一长串命令序列的麻烦. 1.8.1 创建临时别名(快捷方式) alias new_command='command sequence' #格式说明 alias install='sudo apt-get install' #实例说明 在声明 install='sudo apt-get install'之后,就可以用install代替'sudo apt-get install'了.使用这种方式声明的别名

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux shell脚本基础学习详细介绍(完整版)二

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

Linux shell脚本流程控制

博主搬家至51CTO,初来乍到,请多指教. 此次我们来通过实例解析Linux shell脚本流程控制 Linux shell脚本流程控制可分为三类:顺序执行,条件选择执行,循环执行 顺序执行:简单理解就是逐行执行脚本内容,逐行解读,逐行执行.(此处不做实例解析) 条件选择执行:可以理解为先进行某一条件的判断选择,再决定执行怎样的脚本内容.常见语句if case 条件选择语句:if if语句用法: 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件

Linux shell脚本中shift的用法说明

Linux shell脚本中shift的用法说明 shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). 示例1:依次读取输入的参数并打印参数个数: run.sh: #!/bin/bash while [ $# != 0 ];do echo "第一个参数为:$1,参数个数为:$#" shift done 输入如下命令运行:run.sh a b c d e f 结果显示如下: 第一个参数为:a

Shell 脚本入门--下

Shell 脚本入门--下 本为大家介绍,本篇介绍内容有:逻辑运算符(& .| .!.^).测试命令.脚本的执行过程 1.逻辑运算符 (1)&与和&&短路与 True .false 1       0 与: 1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 对于&来说,如果左侧条件为false,也会计算右侧条件的值.特点只要有一个false就认为是false 短路与: false && =