The Sixth Week(Lucklyzpp)
expect指令碼示例,簡單在這記錄下下面會用到的一些命令
set timeout #設定超時時間,預設超時時間10s.
spawn shell command # spawn後面接的是我們要執行的shell命令
expect "hi" #匹配輸出內容“hi”
{send “hello\r”} # 匹配到內容''hi"後輸出“hello”,“\r”是代表是返回字元。
interact #執行完成後保持互動狀態,把控制權交給控制檯,這個時候就可以手工操作了。如果沒有這一句登入完成後會退出,而不是留在遠端終端上。如果你只是登入過去執行一段命令就退出,可改為[expect eof]
1 ,編寫指令碼實現登陸遠端主機。(使用expect和shell指令碼兩種形式)。
[14:39:22 root@lucklyzpp8 data]#cat login_expect2.exp #!/usr/bin/expect set ip [lindex $argv 0] set port [lindex $argv 1] set passwd "root123" spawn ssh $ip -p$port expect { "yes/no" {send "yes\r";exp_continue} "password:" {send "$passwd\r"} } interact [14:37:42 root@lucklyzpp8 data]#./login_expect2.exp 192.168.33.128 22 spawn ssh 192.168.33.128 -p22 root@192.168.33.128's password: Last login: Mon Oct 18 22:36:26 2021 from 192.168.33.131 [22:38:50 root@lucklyzpp7 ~]# [22:58:50 root@lucklyzpp7 ~]#exit [14:59:29 root@lucklyzpp8 data]#cat login_expect.exp #!/usr/bin/expect spawn ssh root@192.168.33.128 expect { "*(yes/no*" { send "yes\r";exp_continue } "*password:*" { send "root123\r";exp_continue } } interact [14:58:15 root@lucklyzpp8 data]#./login_expect.exp [22:58:37 root@lucklyzpp7 ~]#ls anaconda-ks.cfg data redis-6.2.5.tar.gz [22:58:38 root@lucklyzpp7 ~]#hostname lucklyzpp7
[15:16:06 root@lucklyzpp8 data]#cat relogin.sh #!/bin/bash Address=192.168.33.128 User=root Passwd=root123 expect <<EOF spawn ssh $User@$Address expect { "*(yes/no*" { send "yes\r";exp_continue } "*password:*" { send "root123\r";exp_continue } } interact; EOF [15:16:11 root@lucklyzpp8 data]#bash relogin.sh spawn ssh root@192.168.33.128 root@192.168.33.128's password: Last login: Mon Oct 18 23:15:31 2021 from 192.168.33.131 [23:16:14 root@lucklyzpp7 ~]#
2、生成10個隨機數保存於陣列中,並找出其最大值和最小值
[15:19:51 root@lucklyzpp8 data]#bash -n zu.sh [15:19:58 root@lucklyzpp8 data]#bash zu.sh “All numbers are 9226 11048 23498 13201 31271 17642 31355 16391 13548 30543” Max is 31355 Min is 9226 [15:20:04 root@lucklyzpp8 data]#cat zu.sh #!/bin/bash declare -i min max declare -a nums for ((i=0;i<10;i++));do nums[$i]=$RANDOM [ $i -eq 0 ] && min=${nums[$i]} && max=${nums[$i]}&& continue [ ${nums[$i]} -gt $max ] && max=${nums[$i]} [ ${nums[$i]} -lt $min ] && min=${nums[$i]} done echo “All numbers are ${nums[*]}” echo Max is $max echo Min is $min
3、輸入若干個數值存入陣列中,採用冒泡演算法進行升序或降序排序
[15:27:39 root@lucklyzpp8 data]#cat mun.sh #!/bin/bash read -p "請輸入數值個數:" COUNT declare -a nums for ((i=0;i<$COUNT;i++));do num[$i]=$RANDOM done echo "The initial array:" echo ${num[@]} declare -i n=$COUNT for (( i=0; i<n-1; i++ ));do for (( j=0; j<n-1-i; j++ ));do let x=$j+1 if (( ${num[$j]} < ${num[$x]} ));then #從大到小排列 tmp=${num[$x]} num[$x]=${num[$j]} num[$j]=$tmp fi done done echo "After sort:" echo ${num[*]} echo "the max integer is $num,the min integer is ${num[$((n-1))]}" [15:29:04 root@lucklyzpp8 data]#bash mun.sh 請輸入數值個數:9 The initial array: 29719 12356 24301 15770 853 20815 9794 20667 13857 After sort: 29719 24301 20815 20667 15770 13857 12356 9794 853 the max integer is 29719,the min integer is 853
4、總結檢視系統負載的幾種命令,總結top命令的指標大概什麼含義
[15:31:48 root@lucklyzpp8 data]#w 15:35:23 up 1:10, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.33.2 14:25 0.00s 0.58s 0.00s w [15:35:23 root@lucklyzpp8 data]#cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 142 model name : Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz stepping : 9 microcode : 0x62 ............. [15:35:49 root@lucklyzpp8 data]#uptime 15:35:54 up 1:11, 1 user, load average: 0.00, 0.00, 0.00 —————————————————————————————— 什麼原因導致cpu不正常了,系統的瓶頸在哪裡,通過vmstat檢視 r:有多少個程序處於run狀態;1個cpu處理10個程序 b: 阻塞的程序;被網路,硬碟顯示處理等待狀態,卡死了,block;有多少個程序在等待 swapd:當數字不停變換,表示記憶體不夠;如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器 si:有多少kb資料從swap進入到記憶體中 so:有多少從記憶體出來的到swap bi:從磁碟讀,判斷磁碟讀 bo:從磁碟寫,判斷磁碟寫 us:使用者佔用cpu,比如mysql,http,表示使用者態的資源,長時間大於50,表示資源不夠,一共是100 sy:系統態 id:空閒的 wa:等待cpu的百分百,有多少程序在等待,這列很大表示cpu不夠用 —————————————————— [15:35:54 root@lucklyzpp8 data]#vmstat 程序 記憶體 交換分割槽 磁碟IO 系統 cpu procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 234164 3260 225864 0 0 47 10 74 163 1 1 98 0 0 [15:36:13 root@lucklyzpp8 data]#top | head -n9 top - 15:36:54 up 1:12, 1 user, load average: 0.22, 0.06, 0.02 Tasks: 136 total, 1 running, 135 sleeping, 0 stopped, 0 zombie %Cpu(s): 5.6 us, 5.6 sy, 0.0 ni, 77.8 id, 11.1 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 699.5 total, 227.9 free, 247.8 used, 223.8 buff/cache MiB Swap: 5120.0 total, 5120.0 free, 0.0 used. 334.9 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1594 root 20 0 274288 4424 3800 R 6.7 0.6 0:00.01 top 1 root 20 0 176752 10784 8348 S 0.0 1.5 0:02.64 systemd
top - 15:45:43 up 1:21, 1 user, load average: 0.07, 0.05, 0.01 15:45:43:系統當前時間 1 users:當前1使用者線上 Tasks: 135 total, 1 running, 134 sleeping, 0 stopped, 0 zombie 135 total:當前有135個任務 1 running:1個任務正在執行 134 sleeping:134個程序處於睡眠狀態 0 stopped:停止的程序數 0 zombie:僵死的程序數 %Cpu(s): 0.0 us, 6.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st us:使用者態程序佔用CPU時間百分比 sy:核心佔用CPU時間百分比 ni:renice值為負的任務的使用者態程序的CPU時間百分比。nice是優先順序的意思
id:空閒CPU時間百分比
wa:等待I/O的CPU時間百分比
hi:CPU硬中斷時間百分比
si:CPU軟中斷時間百分比
sar命令介紹。
監控系統狀態 [15:45:44 root@lucklyzpp8 data]#yum install -y sysstat 15:57:18 root@lucklyzpp8 data]#sar -n DEV 1 Linux 4.18.0-193.el8.x86_64 (lucklyzpp8) 2021年10月18日 _x86_64_ (1 CPU) 15時58分28秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 15時58分29秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 檢視系統負載 [15:58:39 root@lucklyzpp8 data]#sar -q 1 5 Linux 4.18.0-193.el8.x86_64 (lucklyzpp8) 2021年10月18日 _x86_64_ (1 CPU) 15時59分51秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 15時59分52秒 0 361 0.00 0.04 0.01 0 15時59分53秒 0 361 0.00 0.04 0.01 0 15時59分54秒 0 361 0.00 0.04 0.01 0 15時59分55秒 0 361 0.00 0.04 0.01 0 15時59分56秒 0 361 0.00 0.04 0.01 0 平均時間: 0 361 0.00 0.04 0.01 0 監控cpu [15:59:56 root@lucklyzpp8 data]#sar -u 1 3 Linux 4.18.0-193.el8.x86_64 (lucklyzpp8) 2021年10月18日 _x86_64_ (1 CPU) 16時00分34秒 CPU %user %nice %system %iowait %steal %idle 16時00分35秒 all 0.00 0.00 0.00 0.00 0.00 100.00 16時00分36秒 all 0.00 0.00 1.98 0.00 0.00 98.02 16時00分37秒 all 0.00 0.00 0.00 0.00 0.00 100.00 平均時間: all 0.00 0.00 0.67 0.00 0.00 99.33 IO傳輸速率的監控 [16:00:37 root@lucklyzpp8 data]#sar -b 3 3 Linux 4.18.0-193.el8.x86_64 (lucklyzpp8) 2021年10月18日 _x86_64_ (1 CPU) 16時01分34秒 tps rtps wtps bread/s bwrtn/s 16時01分37秒 0.00 0.00 0.00 0.00 0.00 16時01分40秒 0.00 0.00 0.00 0.00 0.00 16時01分43秒 0.00 0.00 0.00 0.00 0.00 tps:每秒鐘物理裝置的 I/O 傳輸總量。 rtps:每秒鐘從物理裝置讀入的資料總量。 wtps:每秒鐘向物理裝置寫入的資料總量。 bread/s:每秒鐘從物理裝置讀入的資料量,單位為 塊/s。 bwrtn/s:每秒鐘向物理裝置寫入的資料量,單位為 塊/s。
5、編寫指令碼,使用for和while分別實現192.168.0.0/24網段內,地址是否能夠ping通,若ping通則輸出"success!",若ping不通則輸出"fail!"
[16:26:20 root@lucklyzpp8 data]#bash ping.sh 192.168.33.2 lived,Successed 192.168.33.1 lived,Successed 192.168.33.131 lived,Successed 192.168.33.127 lived,Successed 192.168.33.128 lived,Successed 192.168.33.222 lived,Successed [16:26:49 root@lucklyzpp8 data]#cat ping.sh #!/bin/bash # Id=192.168.33. for HostId in {1..254};do { if /bin/ping -c 1 -W 1 $Id$HostId > /dev/null;then echo "$Id$HostId lived,Successed" else echo "$Id$HostId not lived,Failed" fi } & done wait [16:26:53 root@lucklyzpp8 data]#bash ping1.sh 2 lived,Successed 1 lived,Successed 131 lived,Successed 128 lived,Successed 127 lived,Successed 222 lived,Successed [16:28:01 root@lucklyzpp8 data]#cat ping1.sh #!/bin/bash # Id=192.168.33. declare -i HostId=1 while [ $HostId -le 254 ];do { ping -c 1 -W 1 $Id$HostId > /dev/null if [ $? -eq 0 ];then echo "$NetId$HostId lived,Successed" else echo "$NetId$HostId no lived,Failed" fi } & let HostId++ done wait
6、每週的工作日1:30,將/etc備份至/backup目錄中,儲存的檔名稱格式 為“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的時間
[16:34:49 root@lucklyzpp8 data]#bash etcback.sh [16:35:02 root@lucklyzpp8 data]#ls /backup/ etcbak-2021-10-17-16.log etcbak-2021-10-17-16.tar.gz [16:35:26 root@lucklyzpp8 data]#cat etcback.sh #!/bin/bash BackDir="/backup" Filename_tar="etcbak-"`date -d "-1 days" +%Y-%m-%d-%H`".tar.gz" Filename_log="etcbak-"`date -d "-1 days" +%Y-%m-%d-%H`".log" [ ! -d $BackDir ]&& mkdir -p /backup tar czvf $BackDir/$Filename_tar /etc > $BackDir/$Filename_log 2>&1
[16:38:57 root@lucklyzpp8 data]#crontab -l
30 1 * * 1-5 /data/etcback.sh