python学习笔记5-shell
与SHELL脚本相关的知识点
shell脚本是什么?它必需吗?
一个shell脚本就是一个文本文件,它包含一个或多个命令。系统管理员你会经常需要使用多个命令来完成一项任务,此时可以添加这些命令到一个文本文件中来完成这些日常且重复的工作。
什么是默认登录shell,如何改变指定用户的登录shell
在Linux操作系统中,'/bin/bash'是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell
# chsh<用户名> -s <新shell>
# chsh mtcx -s /bin/sh
可以在shell脚本中年使用哪些类型的变量?
在shell脚本中,可以使用两种类型的变量:系统变量和用户变量。系统变量是由系统创建的。这些变量通常由大写字母组成,可以通过“set”命令查看。用户变量是由系统用户来生成和定义,变量的值可以通过命令“echo $<变量名>”查看
如何将标准输出和错误输出同时重定向到同一位置?
方法一,使用“2>&1”
ls /usr/share/doc > out.txt 2>&1
方法一,使用“&>”
ls /usr/share/doc &> out.txt
shell脚本中if语句如何嵌套
if[条件]
then
命令1
……
else
if[条件]
then
命令1
……
else
命令1
……
fi
fi
shell脚本中$?标记的用途是什么?
在写一个shell脚本时,如果想要检查一个命令是否执行成功,那么可以使用$?来检查前一条命令的结束状态。
root@localhost:~# ls /usr/bin/shar
/usr/bin/shar
root@localhost:~# echo $?
0
如果结束状态是0,则说明前一个命令执行成功
root@localhost:~# ls /usr/bin/share
ls:cannot access /usr/bin/share:No such file or dicetory
root@localhost:~# echo $?
2
如果状态不是0,则说明前一个命令执行失败
在shell脚本中如何比较两个数字
在if-then中使用测试命令(-gt 等)来比较两个数字
#!/bin/bash
x=10
y=20
if[$x -gt $y]
then
echo "x is greater than y"
else
echo "y is greater than x"
fi
shell里面比较字符常用的写法
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串
shell脚本中break命令的作用有哪些?
break命令可以退出循环,可以在while和until循环中使用break命令跳出循环
shell脚本中continue命令的作用有哪些?
continue命令不同于break命令,它只跳出当前循环的迭代,而不是整个循环。continue命令很多时候是很有用的,例如错误发生,但是依然希望执行外层循环的时候
shell脚本中case语句
case $arg iin
patten | sample)#arg iin patten or sample
;;
patten1)#arg in patten1
;;
*)#dedault
;;
esac
说明:pattern1是正则表达式,可以私用下面任意字符
- *表示任意字串
- ?表示任意子元
- [abc]表示a,b或c三字元其中一个
- [a-n]表示从2到你的任一资源
- |表示多重选择
#!/bin/sh
echo -n "enter a number from 1 to 4"
read ANS
case $ANS in
1) echo "you select 1"
;;
2) echo "you select 2"
;;
3) echo "you select 3"
;;
4) echo "you select 4"
*)echo "'basename $0':This is not between 1 and 4">&2
exit
;;
Esac
请写出shell脚本中while循环语法?
如同for循环,while循环只要条件成立就会重复执行它的命令块,不同于for循环,while循环会不断迭代,直到它的条件为假。
while[条件]
do
命令……
Done
如何使用脚本执行
使用chmod命令给脚本添加可执行权限。
# chmod a+x myscript.sh
“#!/bin/bash”的作用是什么?
“#!/bin/bash”是shell脚本的第一行,意思是后续命令都通过/bin/bash来执行。
请写出for循环的语句
for 变量 in 循环列表
do
命令1
……
最后命令
Done
如何调试shell脚本?
使用“-x”参数(sh -x myscript.sh)可以调试shell脚本。另一种方法是使用“-nv”参数(-sh -nv myscript.sh)
shell脚本如何比较字符串
test命令可以用来比较字符串。测试命令会通过比较字符串中的每一个字符来比较。其实test还有下述用途
- 判断表达式
if test (表达式为真)
if test !表达式为假
test 表达式1 -a 表达式2 #两个表达式都为真
test 表达式1 -o 表达式2 #两个表达式有一个为真
- 判断字符串
test -n 字符串 #字符串的长度非零
test -z 字符串 #字符串的长度为零
test 字符串 1=字符串 2 #字符串相等
test 字符串1 != 字符串2 #字符串不等
- 判断整数
test 整数1 -eq 整数2 #整数相等
test 整数1 -ge 整数2 #整数1大于等于整数2
test 整数1 -gt 整数2 #整数1大于整数2
test 整数1 -le 整数2 #整数1小于等于整数2
test 整数1 -lt 整数2 #整数1小于整数2
test 整数1 -ne 整数2 #整数1不等于整数2
- 判断文件
test File -ef File2 #两个文件具有同样的设备好和i结点号
test File -nt File2 #文件1比文件2新
test File -ot File2 #文件1比文件2旧
test -b File #文件存在并且是块设备文件
test -c File #文件存在并且是字符设备文件
test -d File #文件存在并且是目录
test -e File #文件存在
test -f File #文件存在并且是正规文件
test -g File #文件存在并且事故设置了组ID
test -G File #文件存在并且属于有效组ID
test -h File #文件存在并且是一个符号链接(同-L)
test -k File #文件存在并且设置了sticky位
test -L File #文件存在并且是一个符号链接(同-h)
test -o File #文件存在并且属于有效用户ID
test -p File #文件存在并且是一个命名通道
test -r File #文件存在并且可读
test -s File #文件存在并且是一个套接字
test -t FD #文件存在并且在一个终端打开
test -u File #文件存在并且设置了它的set-user-id位
test -w File #文件存在并且可写
test -x File #文件存在并且可执行
Bourne shell(bash)中哪些特殊的变量?
$0 命令行中的脚本名字
$1 第一个命令行参数
……
$9 第九个命令行参数
$# 命令行参数的数量
$* 所有命令行参数,以空格隔开
如何让shell脚本获取来自终端的输入?
#使用read命令可以读取来自终端的(使用键盘)的数据。read命令得到用户的输入并置于给出的变量中。
#!/bin/bash
echo 'Please enter your name'
read name
echo "My Name is $name"
如何取消变量或取消变量赋值?
“unset”命令用于取消变量或取消变量赋值。
# unset <变量名>
如何执行算术运算
#使用expr命令
expr 5+2
#用一个$和[]
test=$[1+3]
echo $test
do-while 语句的基本格式是什么?
do{
命令
}while(条件)
在shell脚本中如何定义一个函数?
[function]函数名[0]
{
命令;
[return int;]
}
如何统计文件a.txt有多少非空行?
grep -c '^..*$'a.txt
或者
grep -v '^$'a.txt | wc -l
文件b.txt,每行以“:”符分成5列,如“1:apple:3:2021-4-2:very good”,如何得到所有行第三列的总和
awk 'BEGIN {FS=":";s=0} {s+=$3} END {print s}' b.txt
取文件c.txt的第60至480行的记录,忽略大小写,统计出重复次数最多的那条记录,及重复次数。
sed -n '60,480'p c.txt | sort | uniq -i -c | sort -rn | head -n 1
如何生成日期格式的文件?
touch exp_table_name_`date+%y%m$d`.dmp
DATE=$(date+%y%m%d)
或者
DATE=$(date+%Y%m%d --date '1 days age') #获取昨天或多天前的日期
如何测试磁盘性能?
用类似如下的方法测试写能力
time dd if=/dev/zero of=/oradate/biddb/testind/testfile.dbf bs=1024000 count=1000
期间系统I/O使用可以使用iostat
iostat -xnp 2 #显示Busy程度
如何格式化输出结果
可以使用column命令
mount
mount | column -t
cat /etc/passwd
cat /etc/passwd | column -t -s:
找到某个路径下以.conf结尾的文件,并将这些文件进行分类
可以通过使用xargs这个命令,将命令输出的结果作为参数传递给另一个命令。最终命令为“find /home/oracle -name *.conf -type f -print | xargs file”
xargs后面不仅可以加文件分类的命令,还可以加其他的很多命令,例如tar命令。另外,可以使用find命令配合tar命令,将指定路径的特殊的特殊文件使用find命令找出来,然后配合tar命令将找出的文件直接打包。
find / -name *.conf -typr f -print | xargs tar cjf test.tar.gz
如何找出内存消耗最大的进程,并从大到小进行排序
ps -aux | sort -rnk 4 | head -20
或者使用top命令
1、在命令行提示符执行top命令
2、输入大写P,则结果按CPU占用降序排序。输入大写M,结果按内存占用降序排序
如何找出CPU消耗最大进程,并从大到小进行排序
ps -aux | sort -rnk 3 | head -20
同样的也可使用top命令
如何持续ping百度的地址并将结果记录到日志总?
ping www.baidu.com | awk '{print $0 " "strftime("%Y-%m-%d %H:%M:%S",systime())}' >> /tmp/pingbd.log &
如何查看tcp连接状态
使用netstat命令
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
如何查找80端口请求数做高的前20个IP地址
netstat -anlp | grep tcp | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n20
如何使用shell脚本来查看多个服务器的端口是否打开?
在配置服务器的时候,需要经常查看服务器的某个端口是否已经开放。如果服务器只有一两台的话,那么只需要使用nc命令来检查端口的开放情况。不管服务器有几台,需要检查的端口有几个,使用shell脚本都可以实现
nc是英文单词netcat的缩写,它是通过使用TCP或UDP的网络协议的连接来读或写数据,可以直接被第三方程序或脚本直接调用。同时,它是一款功能非常强大的网络调试工具,因为它可以创建几乎所有需要的连接方式
nc工具主要有三种功能模式:连接模式、监听模式、通道模式
-g<网关>:设置路由器跃程通信网关,最多设置个
-G<指向器数目>:设置来源路由指向器,器数值为4的倍数
-h:在线帮助
-i<延迟秒数>:设置时间间隔,以便缠讼信息及扫描通信端口
-l:使用建通模式,监控传入的资料
-n:直接使用IP地址,而不通过域名服务器
-o<输出文件>:指定文件名称,把往来传输的数据以十六进制字码倾倒成该文件保存
-p<通信端口>:设置本地主机使用的通信端口
-r:指定源端口和目的端口都进行随机的选择
-s<来源位址>:设置本地主机送出数据包的IP地址
-u:使用UDP传输协议
-v:显示指令执行过程
-w<超时秒数>:设置等待连线的时间
-z:使用0输入/输出模式,只在扫描通信端口时使用
nc -zvw3 192.168.1.108 22
nc -zvw3 192.168.1.108 1521
扫描多台服务器的一个端口是否打开
#!/bin/sh
for server in `more server-list.txt`
do
#echo $i
nc -avw3 $server 22
done
给这个脚本赋予可执行权限
chmod +x port_scan.sh
扫描多台服务器的多个端口是否打开
#!/bin/sh
for server in `more server-list.txt`
do
for port in `more port-list.txt`
do
nc -zvw3 $server $port
echo ""
done
done
chmod +x multiple_port_scan.sh
附录:
#cat server-list.txt
192.168.1.108
192.168.1.107
192.168.1.106
192.168.1.105
#cat port-list.txt
22
80