1. 程式人生 > 其它 >The Sixth Week(Lucklyzpp)

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