shell应用

一.shell应用

1.1批量添加用户并且添加密码

[root@shell shell]# cat 1.sh

#!/bin/bash
echo "-------add user--------"
for i in {1..9}
do
    useradd user$i
    passwd=old$i
    echo "$passwd"|passwd --stdin user$i
done

1.2编写tomcat的启动脚本

[root@long01 init.d]# vi tomcat

#!/bin/bash
tomcat_home=/usr/local/tomcat7
case $1 in
        start)
                sh $tomcat_home/bin/startup.sh
                ;;
        stop)
                sh $tomcat_home/bin/shutdown.sh
                ;;
        restart)
                sh $tomcat_home/bin/shutdown.sh
                sh $tomcat_home/bin/startup.sh
                ;;
        *)
                echo 'please use : tomcat{start |stop|restart}'
                ;;
esac
exit 0

[root@long01 init.d]# ./tomcat start

1.3查找一个文件是否存在

[root@shell 7-11]# cat 3.sh

#!/bin/bash
if test -f /etc/hosts
	then
		echo 1
else	
		echo 0
fi
[root@shell 7-11]# cat 2.sh 
#!/bin/bash
if [ -f /etc/hosts ];then
	echo 1
else
	echo 0
fi

1.4内存不足报警

[root@shell 7-11]# cat 5.sh

#!/bin/bash
freemem=`free -m|awk 'NR==3 {print $4}'`
chart="current memory is $freemem"
if [ $freemem -lt 100 ];then
	echo "$chart is full"
else
	echo "$chart is no"
fi

1.5判断两个变量的大小

[root@shell 7-11]# cat 6.sh

#!/bin/bash
read -p "please input two num:" a b
if [ $a -gt $b ];then
	echo "yes,$a greater $b"
elif [ $a -lt $b ];then
	echo "yes,$a lesster $b"
else 
	echo "yes, $a equal $b"
fi

[root@shell 7-11]# source 6.sh
please input two num:1 2
yes,1 lesster 2
[root@shell 7-11]# source 6.sh
please input two num:3 2
yes,3 greater 2
[root@shell 7-11]# source 6.sh
please input two num:1 1
yes, 1 equal 1

1.6判断mysql 服务是否正常

[root@shell 7-11]# cat 7.sh

#!/bin/bash
if [ `netstat -ntlp|grep mysqld|wc -l` -gt 0 ];then
	echo "mysqld is running"
else
	echo "mysqld is stopped"
	/etc/init.d/mysqld start
fi

[root@shell 7-11]# source 7.sh
mysqld is running

1.7计算1到100的和

[root@shell 7-18]# sh 4.sh
totalsum is :5050
[root@shell 7-18]# cat 4.sh

#!/bin/bash
sum=0
for i in {1..100}
do
	sum=$[$sum+$i]
done
	echo "totalsum is :$sum"

1.8判断变量值或字符串是否为整数

[root@shell 7-21]# i=5
[root@shell 7-21]# expr $i + 6 &>/dev/null
[root@shell 7-21]# echo $?
0
[root@shell 7-21]# i=oldboy
[root@shell 7-21]# expr $i + 6 &>/dev/null
[root@shell 7-21]# echo $?
2

1.9 批量更改文件的扩展名

[root@shell 7-27]# ls
11.sh 21.gif 24.gif 27.gif 2.sh 4.sh test.gif
1.sh 22.gif 25.gif 28.gif 30.gif 5.sh tetre.gif
20.gif 23.gif 26.gif 29.gif 3.sh gogo.gif
[root@shell 7-27]# cat 11.sh

#!/bin/bash
cd /shell/7-27
for filename in `ls|grep "txt$"`
do
	mv $filename `echo $filename|cut -d . -f1`.gif
done

1.10.乘法表

[root@shell 7-27]# cat 12.sh

#!/bin/bash
for num1 in `seq 9`
do
	for num2 in `seq 9`
	do
	if [ $num1 -ge $num2  ];then
		if (((num1*num2)>9));then
			echo -en "${COLOR}${num1}x${num2}=$((num1*num2))$RES "
		else
			echo -en "${COLOR}${num1}x${num2}=$((num1*num2))$RES  "
		fi
	fi
        done
echo ""
done

1.11数据库备份

#!/bin/bash
myuser=root
mypass=00000000
socket=/var/lib/mysql/mysql.sock
mycmd="mysql -u$myuser -p$mypass -S $socket"
for dbname in boy girl
do
	$mycmd -e "create database $dbname"
done

#!/bin/bash
dbpath=/root/backup
myuser=root
mypass=00000000
socket=/var/lib/mysql/mysql.sock
mycmd="mysql -u$myuser -p$mypass -S $socket"
mydump="mysqldump -u$myuser -p$mypass -S $socket"
[ ! -d "$dbpath"  ] && mkdir $dbpath
for dbname in `$mycmd -e "show databases;"|sed '1,2d'|egrep -v "mysql|schema"`
do
	$mydump $dbname|gzip>$dbpath/${dbname}_$(date +%F).sql.gz
Done

#!/bin/bash
myuser=root
mypass=00000000
socket=/var/lib/mysql/mysql.sock
mycmd="mysql -u$myuser -p$mypass -S $socket"
for dbname in boy girl
do
	$mycmd -e "use $dbname;create table test2(id int,name varchar(16));insert into test2 values(1,'testdate');"
done


#!/bin/bash
myuser=root
mypass=00000000
socket=/var/lib/mysql/mysql.sock
mycmd="mysql -u$myuser -p$mypass -S $socket"
for dbname in boy girl
do
	echo "========$dbname.test2========"
	$mycmd -e "use $dbname;select * from ${dbname}.test2;"
done

1.12批量添加随机密码的用户

[root@shell 7-28]# cat 5.sh

#!/bin/bash
user="old"
passfile="/tmp/user.log"
for num in {1..10}
do
	useradd $user$num
	
        pass="`echo "test$RANDOM"|md5sum|cut -c3-11`"
	echo "$pass"|passwd --stdin $user$num
	echo -e "user:$user$num\tpasswd:$pass">>$passfile
done
echo ----this is oldboy trainning class contents----
cat $passfile

在这里插入图片描述

1.13判断字符串的个数

[root@shell 7-30]# sh 2.sh
i
am
oldboy
to
oldboy
class
[root@shell 7-30]# cat 2.sh

#!/bin/bash
a=(i am oldboy teacher welcome to oldboy training class)
for n in ${a[*]}
do
	if [ `echo $n|wc -L` -le 6 ];then
		echo $n
	fi
done

1.14扫描网段内存活的主机

[root@shell ~]# cat 6.sh

#!/bin/bash
CMD="ping -c 2"
IP="192.168.1."
for n in {1..254}
do 
	$CMD $IP$n &>/dev/null
	if [ $? -eq 0 ];then
		echo "$IP$N is ok"
	fi
done

[root@shell ~]# vi 6.sh
[root@shell ~]# sh 6.sh
192.168.1.1 is ok

1.15 mysql主从复制异常监控

[root@mysql02 ~]# cat 2.sh 
#!/bin/bash
MYSQL_PD="mmds#123"
MYSQLCMD="mysql -uroot -p${MYSQL_PD}"
Slave_IO_Running=`${MYSQLCMD} -e "show slave status\G;" 2>/dev/null|grep 'Slave_IO_Running'|awk  '{print $2}'`
Slave_SQL_Running=`${MYSQLCMD} -e "show slave status\G;" 2>/dev/null|grep 'Slave_SQL_Running'|awk '{print $2}'`
Seconds_Behind_Master=`${MYSQLCMD} -e "show slave status\G;" 2>/dev/null|grep 'Seconds_Behind_Master'|awk '{print $2}'`
if [[ "${Slave_IO_Running}" = "Yes"  ||  "${Slave_SQL_Running}" = "Yes" || ${Seconds_Behind_Master} = 0 ]];then
	echo "mysql_salve_status succeed!"
else
	echo "mysql_salve_status failed!"
fi
[root@mysql02 ~]# sh 2.sh 
mysql_salve_status succeed!

二.问题集锦

2.1 过滤apache的access.log访问最多5个ip

[root@nginx01 ~]# cat /var/log/nginx/access.log|awk -F ‘[ -]+’ ‘{print $1}’|sort|uniq -c|sort -r |head -n5
10 192.168.1.111
6 192.168.1.232
2 192.168.43.1
在这里插入图片描述

2.2 过滤ip地址

[root@nginx01 ~]# ifconfig eth0|grep inet|awk -F ‘[:]+’ ‘NR==1 {print $2}’|awk ‘{print $1}’
192.168.1.231
在这里插入图片描述

2.3 http状态码

200-ok:服务器成功返回网页,这是成功的http请求返回的标准状态码
301-moved permanently: 永久跳转,所请求的网页将永久跳转到设定的新位置,例如:从gdcp.cn 跳转到www.gdcp.cn
403-Forbidden: 禁止访问,虽然这个请求是合法的,但是服务器端因为了预先设置的规则而拒绝响应客户端的请求。
404-not found:服务器找不到客户端请求的指定页面,可能是客户端请求了服务器上不存在的资源所致。
500-internal server error: 内部服务器错误,服务器遇到了意想不到的情况,不能完成客户的请求,一般是服务器的设置或者内部程序问题导致的。
502-bad gateway: 坏的网关,一般是代理服务器请求后端服务时,后端服务不可用或没有完成响应网关服务器。一般是节点出问题所致
503-server unavailable: 服务当前不可用,可能是服务器超载或停机维护所导致
504-gateway timeout: 网关超时,一般是网关代理服务器请求后端时,后端服务器没有在特定时间完成处理请求。

查看状态码的方法:
在这里插入图片描述
在这里插入图片描述

2.4 iptalbes设置策略

[root@nginx01 ~]# iptables -A INPUT -p tcp -s 192.168.1.111 --dport 80 -j ACCEPT
#使用iptabes 允许192.168.1.111 访问本机80端口,其余机器禁止访问80端口

2.5 linux启动过程

一般来说,所有的操作系统的启动流程基本就是:
在这里插入图片描述
1)开机BIOS自检,加载硬盘。
2)读取MBR,进行MBR引导。
3)grub引导菜单(Boot Loader)。
4)加载内核kernel。
5)启动init进程,依据inittab文件设定运行级别
6)init进程,执行rc.sysinit文件。
7)启动内核模块,执行不同级别的脚本程序。
8)执行/etc/rc.d/rc.local
9)启动mingetty,进入系统登陆界面。

2.6 用文件做swap分区

1.创建要作为swap分区的文件:增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。
#dd if=/dev/zero of=/root/swapfile bs=1M count=1024
2.格式化为交换分区文件:
#mkswap /root/swapfile #建立swap的文件系统
3.启用交换分区文件:
#swapon /root/swapfile #启用swap文件
4.使系统开机时自启用,在文件/etc/fstab中添加一行:
/root/swapfile swap swap defaults 0 0

2.7 跨地区做路由测试

[root@nginx01 ~]# traceroute www.baidu.com
在这里插入图片描述

2.8 利用ssh上传、下载

在Linux上安装lrzsz
[root@localhost ~]# rz
-bash: rz: command not found
##For CentOS/RHEL
[root@localhost ~]# yum -y install lrzsz

##For Ubuntu
#sudo apt-get install lrzsz
5、简单用法
• sz用法:发送出去
6 ### 下载一个文件:
#sz filename
###下载多个文件:
#sz filename1 filename2
###下载dir目录下的所有文件,不包含dir下的文件夹:
#sz dir/*
• rz用法:接收回来
4 ### 直接键入rz命令即可
#rz

###直接拖动文件到 xshell, 或者 SecureCRT 窗口即可
输入rz回车后,会出现文件选择对话框,选择需要上传文件,一次可以指定多个文件,上传到服务器的路径为当前执行rz命令的目录。

2.9 vlan知识点

什么是vlan,为什么划分vlan
VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接互通,从而将广播报文限制在一个VLAN内。

当主机数目较多时会导致冲突严重、广播泛滥、性能显著下降甚至造成网络不可用等问题。
通过交换机实现LAN互连虽然可以解决冲突严重的问题,但仍然不能隔离广播报文和提升网络质量。
在这种情况下出现了VLAN技术,这种技术可以把一个LAN划分成多个逻辑的VLAN,每个VLAN是一个广播域,VLAN内的主机间通信就和在一个LAN内一样,而VLAN间则不能直接互通,这样,广播报文就被限制在一个VLAN内。
使用VLAN能给用户带来以下受益:
1、限制广播域: 广播域被限制在一个VLAN内,节省了带宽,提高了网络处理能力。
2、增强局域网的安全性:不同VLAN内的报文在传输时是相互隔离的,即一个VLAN内的用户不能和其它VLAN内的用户直接通信。
3、提高了网络的健壮性:故障被限制在一个VLAN内,本VLAN内的故障不会影响其他VLAN的正常工作。
4、灵活构建虚拟工作组:用VLAN可以划分不同的用户到不同的工作组,同一工作组的用户也不必局限于某一固定的物理范围,网络构建和维护更方便灵活。

2.10 ftp管理多个目录

1.创建用户test,密码gz_test#2
[root@liangkeyiwei-gpsstorage test]# useradd test
[root@liangkeyiwei-gpsstorage test]# passwd test

2.在其家目录下创建相应的目录
[root@test]cd /home/test
[root@test]mkdir data
[root@test]mkdir data1
[root@test]mkdir data2
[root@test]mkdir data3
[root@test]mkdir data4

3.授权
[root@test]chown -R test:test /home/test/

4.挂载
[root@test]mount --bind -o rw /data/test/ /home/test/data
[root@test]mount --bind -o rw /data1/test/ /home/test/data1
[root@test]mount --bind -o rw /data2/test/ /home/test/data2
[root@test]mount --bind -o rw /data3/test/ /home/test/data3
[root@test]mount --bind -o rw /data4/test/ /home/test/data4

5.以test用户登录ftp,可以查看到test目录下的文件已经在/home/test/下的相对应的目录下了

2.11 linux下强行卸载设备

1.使用umount -f,问题依旧
在这里插入图片描述
2.使用fuser命令,先确认有那些进程需要杀掉
[root@localhost /]# fuser -cu /mnt
/mnt: 15060c(root)
其次向进程发出SIGKILL信号
[root@localhost /]# fuser -ck /mnt
/mnt: 15060c
[root@localhost /]# fuser -c /mnt

3.然后直接卸载
[root@localhost /]# umount /mnt

2.12 查询mysql字段类型为date

select * from DF where SHIJIAN between to_date(‘1/01/2017 00:00:00’, ‘dd/MM/yyyy hh24:mi:ss’) and to_date(‘31/12/2017 23:59:59’, ‘dd/MM/yyyy hh24:mi:ss’) order by SHIJIAN

2.13 mv命令操作

[root@infa01 data]# ls
2018-11-01 2018-11-03 2018-11-05 2018-11-07 2018-11-09
2018-11-02 2018-11-04 2018-11-06 2018-11-08
#在data目录下新建九个文件夹
[root@infa01 data4]# mv /root/data/2018-11-0{1…9}
#执行这个命令后
[root@infa01 data]# ls
2018-11-09
#data目录下只有2018-11-09了,这是怎么回事呢?
[root@infa01 data]# cd 2018-11-09/
[root@infa01 2018-11-09]# ls
2018-11-01 2018-11-03 2018-11-05 2018-11-07
2018-11-02 2018-11-04 2018-11-06 2018-11-08
#原来是移动到2018-11-09了

2.14 线程和进程

进程概念
  进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。

线程概念
  线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性

引入线程的好处
(1)易于调度。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)开销少。创建线程比创建进程要快,所需开销很少。。
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。

进程和线程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

在这里插入图片描述

2.15 tcp三次握手

1.1 TCP 三次握手

第一次
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的

概念:
为什么 A 还要发送一次确认呢?
主要是为了防止已失效的连接请求报文段突然又传送到 B,因而产生错误。

正常情况
A 发出连接请求,但是因为连接请求报文丢失为未收到确认。于是 A 在重传一次连接请求,后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A 共发送两个连接请求报文段,其中第一个丢失第二个到达了 B。

异常情况
A 发出的第一个连接请求报文段并没有丢失,而是在某些网络节点长时间滞留,导致延误到连接释放之后才到达了 B,本来这是一个早已经失效的报文段,但是B收到此失效的连接请求报文段之后,误以为是 A 又发出一次新的连接请求,于是就向 A 发送确认报段,同意建立连接。假如不采用三次握手,那么只要 B 发出确认,新的连接就建立了。由于现在A 并没有发出建立连接的请求,因此不会理睬 B 的确认,也不会向 B 发送数据,但 B 却以为新的运输连接已经建立了,并且一直等待 A 发来数据。B 的资源就这样白白的浪费了, 采用三次握手的办法可以防止上述现象的发生。例如刚才的情况,A 不会向 B 的确认发出确认。B由于接收不到确认,就知道 A 并没有要求建立连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老哥爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值