目录
❀My学习Linux命令小记录(12)❀
46.arp指令
47.tcpdump指令
48.chmod指令
49.chown指令
50.bash调用脚本指令
shell介绍
shell脚本的组成部分
脚本执行方式
检查脚本语法
bash之变量
变量的种类:根据生效的范围不同来区分
bash的配置文件
profile类:为交互式登录的shell提供配置
bashrc类:为非交互式登录的shell提供配置
bash的IO重定向
bash算数运算:bash对数字进行隐式的类型转换
bash条件测试
bash的测试类型:
文件测试:测试文件存在与否,属性信息等
bash的逻辑运算:true(0)、false(1-255)
编写脚本backup.sh,可实现每日将/etc/目录备份到 /root/etcYYYY-mm-dd中
编写脚本nologin.sh和login.sh,实现禁止和允许普通用户登录系统
编写脚本disk.sh,显示当前硬盘分区中空间利用率最大的值
功能说明:arp 命令用于显示和修改 IP 到 MAC 转换表。
(ps.arp 命令是 Address Resolution Protocol,地址解析协议,是通过解析网络层地址来找寻数据链路层地址的一个网络协议包中极其重要的网络传输协议。而该命令可以显示和修改 arp 协议解析表中的缓冲数据。它将 IP 地址映射到物理 MAC 地址。)
基本语法:arp(选项)(参数)
选项:
-a 主机 :显示 arp 缓冲区的所有条目;
-H 地址类型 :指定 arp 指令使用的地址类型;
-d 主机 :从 arp 缓冲区中删除指定主机的 arp 条目;
-D:使用指定接口的硬件地址;
-e:以 Linux 的显示风格显示 arp 缓冲区中的条目;
-i 接口 :指定要操作 arp 缓冲区的网络接口;
-s 主机 MAC 地址 :设置指定的主机的 IP 地址与 MAC 地址的静态映射;
-n:以数字方式显示 arp 缓冲区中的条目;
-v:显示详细的 arp 缓冲区条目,包括缓冲区条目的统计信息;
-f 文件 :设置主机的 IP 地址与 MAC 地址的静态映射。
实例:
# arp -a #显示系统的 ARP 表
# arp -v #显示arp 缓冲区内容
#添加静态 arp 映射
arp -s IP MAC-ADDRESS
arp -s 192.168.1.1 00:b1:b2:b3:b4:b5
#删除 arp 缓存条目
arp -d 192.168.1.1
功能说明:一款sniffer工具,是Linux上的抓包工具,嗅探器。
(ps.tcpdump命令 是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。)
基本语法:tcpdump(选项)
选项:
-a:尝试将网络和广播地址转换成名称;
-c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作;
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;
-e:在每列倾倒资料上显示连接层级的文件头;
-f:用数字显示网际网络地址;
-F<表达文件>:指定内含表达方式的文件;
-i<网络界面>:使用指定的网络截面送出数据包;
-l:使用标准输出列的缓冲区;
-n:不把主机的网络地址转换成名字;
-N:不列出域名;
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q :快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件读取数据包数据;
-s<数据包大小>:设置每个数据包的大小;
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间戳记;
-tt: 在每列倾倒资料上显示未经格式化的时间戳记;
-T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型;
-v:详细显示指令执行过程;
-vv:更详细显示指令执行过程;
-x:用十六进制字码列出数据包资料;
-w<数据包文件>:把数据包数据写入指定的文件。
实例:
# tcpdump #直接启动tcpdump将监视第一个网络接口上所有流过的数据包
# tcpdump -i eth0 #捕获指定网络接口的所有数据包
# tcpdump udp port 123 #对本机的udp 123 端口进行监视 123 为ntp的服务端口
# tcpdump -i any port 80 -A #抓取80端口的HTTP报文,以文本形式展示
# tcpdump ip and not net localnet #打印所有源地址或目标地址是本地主机的IP数据包(如果本地网络通过网关连到了另一网络,则另一网络并不能算作本地网络。)
# tcpdump host 192.168.1.1 #捕获指定主机的数据包
# tcpdump src port 80 or dst port 80 #捕获源或目标端口为80的数据包
# tcpdump -X #显示数据包的内容(以16进制和ASCII形式)
# tcpdump -i eth0 -w capture.pcap #将捕获的数据包保存到文件中
# tcpdump -r capture.pcap #从保存的文件中读取数据包进行分析
# tcpdump -v #显示捕获的数据包的包头信息
# tcpdump -vv #显示更详细的包头信息
# tcpdump -i eth0 -n 'tcp port 80' #捕获并显示特定协议的数据包(例如,只显示HTTP流量)
功能说明:用来变更文件或目录的权限。
(ps.chmod命令 用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。)
权限范围的表示法如下:
u User,即文件或目录的拥有者;
g Group,即文件或目录的所属群组;
o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
a All,即全部的用户,包含拥有者,所属群组以及其他用户;
r 读取权限,数字代号为“4”;
w 写入权限,数字代号为“2”;
x 执行或切换权限,数字代号为“1”;
- 不具任何权限,数字代号为“0”;
s 特殊功能说明:变更文件或目录的权限。
基本语法: chmod(选项)(参数)
选项:
u # 操作对象简称,用户user,文件或目录的所有者。
g # 操作对象简称,同组用户group,文件或目录所属群组
o # 操作对象简称,其它用户others
a # 操作对象简称,所有用户all,系统默认使用此项
+ # 权限操作符,添加某些权限
- # 权限操作符,取消某些权限
= # 权限操作符,设置文件的权限为给定的权限
r # 权限设定(英文),表示可读权限
w # 权限设定(英文),表示可写权限
x # 权限设定(英文),表示可执行权限
- # 权限设定(英文字符),表示没有权限
X # 权限设定,如果目标文件是可执行文件或目录,可给其设置可执行权限
s # 权限设定,设置权限suid和sgid,使用权限组合“u+s”设定文件的用户的ID位,“g+s”设置组ID位
t # 权限设定,只有目录或文件的所有者才可以删除目录下的文件
-c或——changes # 效果类似“-v”参数,但仅回报更改的部分,如果文件权限已经改变,显示其操作信息;
-f或--quiet或——silent # 操作过程中不显示任何错误信息;
-R或——recursive # 递归处理,将指令目录下的所有文件及子目录一并处理;
-v或——verbose # 显示命令运行时的详细执行过程;
--reference=<参考文件或目录> # 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
<权限范围>+<权限设置> # 开启权限范围的文件或目录的该选项权限设置;
<权限范围>-<权限设置> # 关闭权限范围的文件或目录的该选项权限设置;
<权限范围>=<权限设置> # 指定权限范围的文件或目录的该选项权限设置;
--help # 显示帮助信息
--version # 显示版本信息
知识扩展和实例:
Linux用户分为:拥有者、组群(Group)、其他(other),Linux系统中,预设的情況下,系统中所有的帐号与一般身份使用者,以及root的相关信息, 都是记录在/etc/passwd文件中。每个人的密码则是记录在/etc/shadow文件下。 此外,所有的组群名称记录在/etc/group內!
linux文件的用户权限的分析图
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules
# ↑╰┬╯╰┬╯╰┬╯
# ┆ ┆ ┆ ╰┈ 0 其他人
# ┆ ┆ ╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ g 属组
# ┆ ╰┈┈┈┈ u 属组
# ╰┈┈ 第一个字母 `d` 代表目录,`-` 代表普通文件
例:rwx rw- r--
r=读取属性 //值=4
w=写入属性 //值=2
x=执行属性 //值=1
# chmod u+x,g+w abc.txt # 为文件abc.txt设置自己可以执行,组员可以写入的权限
# chmod u=rwx,g=rw,o=r abc.txt #给文件abc.txt设置权限,使用者权限为rwx即可读可写可执行,组员权限可读可写不可执行,其他人权限只可读
# chmod 764 abc.txt #为文件abc.txt增加权限764,使用者权限7(4+2+1)读可写可执行,组员权限6(4+2)可读可写不可执行,其他人权限4(4)只可读
# chmod a+x abc.txt # 对文件abc.txt的u,g,o都设置可执行属性
将/home/wwwroot/里的所有文件和文件夹设置为755权限
①# chmod -R 755 /home/wwwroot/*
②# cd /home/wwwroot
# chmod -Rv 755 * #注意:“*”表示通配符,指的是所有文件和文件
# sudo chmod o+rw /shared #设置文件夹权限以保证其余用户可以访问它
功能说明:用来变更文件或目录的拥有者或所属群组。
(ps.chown命令 改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。
只有文件主和超级用户才可以便用该命令。)
语法:chown(选项)(参数)
选项:
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quite或——silent:不显示错误信息;
-h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-v或——version:显示指令执行过程;
--dereference:效果和“-h”参数相同;
--help:在线帮助;
--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
--version:显示版本信息。
实例:
# chown -R rosy /usr/meng #将目录/usr/meng及其下面的所有文件、子目录的文件主改成 rosy
编程语言分为两种
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell是一个用C语言编写的程序,它是用户使用Linux系统的窗口,一个桥梁,起到人机交互的作用。
shell既是一种命令语言,又是一种简单的程序设计语言,为什么说简单,因为有很多复杂的工作不用Shell去做。
shell本身是一种应用程序,运行与内核之上,这个应用程序为提供了一个界面,用户可通过这个界面访问操作系统内核的服务。shell是Linux系统内嵌的,安装操作系统之后看到的界面就是一个shell程序提供的界面。
shell程序: 是一个过程式的解释器,把源代码翻译成机器语言,然后执行,对于过程式语言来讲,是一行一行翻译并执行的;
shell程序开头的环境指定:称之为shebang,如下:
#!/bin/bash
#!/bin/python
#!/bin/perl
shebang是告诉操作系统内核通过哪一个解释器来执行当前脚本;
#:行首为#号则为注释行,额外的解释信息
第一个脚本
#!/bin/bash
echo "Hello World !!!"
需给予脚本执行权限
# chmod +x hello.sh
通过脚本文件所在绝对路径进行执行
# /root/hello.sh
直接运行解释器,将脚本作为解释器的参数来执行
# sh hello.sh
bash -n :测试语法是否正确
bahs -x :查看脚本执行过程
bash -xv :更详细的查看脚本执行过程
例:bash -x hello.sh
变量=变量名+指向的内存空间
将数据存放于内存中,为了方便使用,为这段数据取了个名字,使用时,直接调用变量名,系统会根据变量名指向的数据位置将数据提取,进行使用。
变量赋值:就是将数据存储于这个变量名指向的内存空间的过程
变量的类型:定义数据存储的格式
①字符型
②数值型:整数型、浮点型
对于编程语言来说变量还分为:强类型和弱类型,bash为弱类型变量语言,如果没有明确表明,bash把所有变量统统视为字符型,而当我们运算时,bash会自动将变量值转为数值型。bash不支持浮点型,除非借助外部工具。
bash中的变量无需事先声明,随用随时到内存空间中定义。
本地变量:范围是当前shell进程
环境变量:范围是当前shell进程和子shell进程
局部变量:范围是当前shell进程某个代码块(通常指函数)
位置变量:用于放在脚本代码块中调用通过命令行传递给脚本的参数
特殊变量:
$?:命令执行的状态值,值的范围0-255,其中0为真,表示命令执行成功,1-255为假,表示命令执行失败。
$#:传递给脚本的参数的个数。
$*:传递给脚本的所有参数,全部参数合为一个字符串。
$@:传递给脚本的所有参数,每个参数为独立字符串。
$0:表示命令本身。
本地变量:
变量赋值:name="value"
value的值也可以引用:
可以直接使用字符串:name="username"
可以使其他变量的值:name="$username"
可以直接引用命令的值:name=`hostname`或者name=#(hostname);
变量引用:${var_name},可简写为$var_name
"":弱引用,其中的变量引用会被替换成变量的值
例:[root@centos_7 ~]# NUM="$PATH";echo $NUM
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
'':强引用,其中的变量引用不会被替换,而是保留引号内原字符串
例:[root@centos_7 ~]# NUM='$PATH';echo $NUM
$PATH
``:命令引用,如括号内是命令,会被识别,返回的是命令执行完成的值
例:[root@centos_7 ~]# NUM=`seq 1 10`;echo $NUM
1 2 3 4 5 6 7 8 9 10
查看变量:set
撤销变量:unset name
输出变量:echo $name
环境变量:
变量赋值:export name=value
declare -x name=value
查看变量:export、declare、env
撤销变量:unset name
输出变量:echo $name
bash有许多内建的环境变量:
PATH,PWD,USER,HOSTNAME,SHELL,UID,HOME等等
只读变量:只读变量的证明周期为当前shell进程的生命周期,随着shell进程的终止而终止
变量赋值:declare -r name
readonly name
位置变量:$1,$2……$10,对应第1,第2个参数
shift:轮替,将第1个参数踢掉,第2个参数变为第一个参数,可一次踢多个,shift#;
set – :清空所有位置变量
命令行中定义的变量会随着当前shell进程的生命周期,Shell进程结束,变量时效
变量名的命名规则:
只能用数字,字母,下划线,且不能使数字开头。
变量名尽量做到见名知意
且不能使用程序的保留字,如PATH、PWD、if、else之类的 。
全局配置文件:对当前主机所有用生效
/etc/profile
/etc/profile.d/*.sh
个人配置文件:只对当前用户生效
.bash_profile
.bashrc
按照功能分,分为两类:
交互式登录:直接通过某终端输入账号和密码后登录打开的shell进程
使用su -命令登陆的方式:su - username
全局:/etc/profile,/etc/profile.d/*.sh
个人:.bash_profile
作用:用于定义环境变量
运行命令或脚本
交互式登录方式文件的读取顺序:
/etc/profile --> /etc/profile.d/*.sh --> .bash_profile --> /etc/bashrc --> .bashrc
注意:仅管理员可修改全局配置文件
非交互式登录:图形界面下打开的终端
使用su username
运行脚本
全局:/etc/bashrc
个人:.bashrc
作用:定义本地变量
定义命令别名
非交互式登录文件的读取顺序:
.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
配置文件定义的特性,只对随后的shell进程生效
让通过编辑配置稳健的特性立即生效:
退出并重新登录
通过命令行重复定义一次
让shell进程重读配置文件
source FileName
. FileName
输出重定向:
> :覆盖输出
>> :追加输出,在原有文件的尾部添加内容
set -C :禁止覆盖输出重定向至已存在的文件
>| :强行覆盖输出
set +C :关闭上述特性
错误输出重定向:
2> :错误覆盖
2>> :错误追加
合并正常输出和错误输出:
&> :覆盖
&>> :追加
/dev/null:相当于一个垃圾箱,当我们不需要将命令执行结果输出至屏幕时,可使用&> /dev/null,把结果丢进垃圾箱,只判断命令执行状态返回值;
重定向写入文件:
cat << EOF
content
...
EOF
----
cat > /PATH/TO/FILE << EOF
content
……
EOF
+,-,*,/,%(取模),**(乘方)
实现算数运算:
let var=算数表达式,如:let var=1+2
例:
[root@centos_7 ~]# let var=1+2
[root@centos_7 ~]# echo $var
3
var=$[算数表达式],如:var=$[1+2]
var=$((算数表达式)),如:var=$((1+2))
echo '算数表达式' | bc ,如echo ‘1+2’ | bc
expr 数值1 运算符 数值2,如expr 1 + 2
增强型复制:
+=,-=,*=,/=,%=
使用方法:let 变量名运算符算数表达式
例:let=i+=1即i=i+1
自增,自减
let i+=1 即let i++
let i-=1 即let i--
例:
[root@centos_7 ~]# let i++;echo $i
1
[root@centos_7 ~]# let i++;echo $i
2
[root@centos_7 ~]# let i++;echo $i
3
判断某条件是否满足,满足则完成某项任务,不满足则退出
条件测试命令的表达式:
test 表达式
[ 表达式 ]
[[ 表达式 ]]
与[ ]不同,[[ ]]双括号内支持正则表达式,而[ ]单括号不支持
常用例:N=abc;[[ $N =~ ^[0-9]+$ ]] && echo true || echo false :解释为,如果$N的值为整数型,则返回true,否则返回false。
注意:表达式两边必须要有空格!
数值测试:
-eq:是否等于
-ne:是否不等
-gt:是否大于
-lt:是否小于
-ge:是否大于或等于
-le:是否小于或等于
字符测试:
==:是否等于
!=:是否不等
>:是否大于
<:是否小于
=~:左侧字符串是否能被右侧模式所匹配
-z "string":测试字符串是否为空,空则为真,不空则为假
-n "string":测试字符串是否不空,不空为真,空则为假
-e file:测试指定文件是否存在,存在为真,不存在则为假
-b file:文件是否存在且为块设备
-d file:文件是否存在且为目录
-c file:文件是否存在且为字符设备
-f file:文件是否存在且为普通文件
-h file:文件是否存在且为符号链接文件
-p file:文件是否存在且为命名管道文件
-S file:文件是否存在且为套接字文件
1)文件权限测试
-r file:文件是否存在且当前用户是否可读
-w file:文件是否存在且当前用户是否可写
-x file:文件是否存在且当前用户是否有执行权限
-u file:文件是否存在且拥有suid权限
-g file:文件是否存在且拥有sgid权限
-k file:文件是否存在且拥有sticky权限
2)文件大小测试
-s file:文件是否存在且非空
3)文件是否被打开
-N file:文件自从上一次被读取之后是否被修改过
-O file:当前用户是否为文件属主
-G file:当前用户是否为文件属组
与运算:
真 && 真 = 真
真 && 假 = 假
假 && 真 = 假
假 && 假 = 假
只要有假便为假
或运算:
真 || 真 = 真
真 || 假 = 真
假 || 真 = 真
假 || 假 = 假
只要有真便为真
非运算:
! 真 = 假
! 假 = 真
ls / &> /dev/null && echo 'hello' :当&&左边条件为真时,&&右边条件执行,&&左边条件为假时,&&右边条件不执行
ls /// &> /dev/null || echo 'hello' :当||左边条件为假时,||右边条件执行,||左边条件为真时,||右边条件不执行
第二种方式:
-a:与远算
-o:或运算
!:非运算
例:主机名是否为localhost,如果是改为centos
[ `hostname` == localhsot ] && hostname centos || echo "current hostname is `hostname`"
例:测试文件是否存在
[ -e /etc/passwd ] && cat /etc/passwd || echo "file not exist.."
例:测试主机名是否为空或者为localhost,如果为空或者为localhost则将其改为centos
[ -z `hostname` -o hostname == `hostname` ] && hostname centos || echo "current hostname is `hostname`"
#!/bin/bash
#
#Filename: backup.sh
#Description: create script file
#Date: 2019-08-20 11:20:30
#*************************************************
dir=etc`date +"%Y-%m-%d"`
DIR=/root/$dir
[ -d $DIR ] && echo "dir exist.." && exit 0
mkdir $DIR
cp -ar /etc/* $DIR && echo -e "\033[1;5;31mcopy finished...\033[0m"
[root@centos7 bin]#cat nologin.sh
#!/bin/bash
#
#*************************************************
#Filename: login.sh
#Description: create script file
#Date: 2019-08-20 11:38:59
#*************************************************
[ `id -u $1` -ge 1000 ] || exit 1
[ $# -lt 1 ] && echo "please input a users .." && exit 0
read -p "your ensure ban user nologin ? input y/n:" NOLOGIN
[ $NOLOGIN == y ] && sed -i -r '/^'''$1'''/s#(.*:)([^:]+)$#\1/bin/nologin#' /etc/passwd && exit 0
[ $NOLOGIN == n ] && exit 0
[root@centos7 bin]#cat login.sh
#!/bin/bash
#
#*************************************************
#Filename: login.sh
#Description: create script file
#Date: 2019-08-20 12:55:48
#*************************************************
[ $# -lt 1 ] && echo "please input a user .." && exit 0
[ ` id -u $1 ` -ge 1000 ] && sed -i -r '/^'''$1'''/s#(.*:)([^:]+)$#\1/bin/bash#' /etc/passwd
read -p "you need login system ? input y/n :" LOGIN
[ $LOGIN == y ] && su - $1
[ $LOGIN == n ] && exit 0
[root@centos7 bin]#cat disk.sh
#!/bin/bash
#
#*************************************************
#Filename: disk.sh
#Description: create script file
#Date: 2019-08-20 13:08:14
#*************************************************
device=`df | grep "/dev/sd" |tr -s " " % | sort -t% -k5 -nr | cut -d% -f1 |head -1`
DISK=`df | grep "/dev/sd" | tr -s " " : | cut -d: -f5 | sort -nr|head -1`
echo "The most used is $device already use $DISK"
❀My学习Linux命令小记录(12)❀over~