shell應用

2020-08-10 15:33:17

一.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

二.問題集錦

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 並沒有要求建立連線。