No.6 shell编程进阶

1、编写脚本实现登陆远程主机。(使用expect和shell脚本两种形式)。
expect形式

#!/usr/bin/expect
set timeout 20
set passwd "cqt@1234"
spawn ssh root@192.168.234.101
expect {
	"yes/no" {send "yes\n"; exp_continue }
	"password" { send "$passwd\n" }

}
interact

执行结果:可以成功登录到test02主机上。

[20:26:10 root@test01 ~]#./expect
spawn ssh root@192.168.234.101
root@192.168.234.101's password: 
Last login: Sun Oct 31 20:18:20 2021 from 192.168.234.1
[20:26:42 root@test02 ~]#
[20:26:43 root@test02 ~]#
[20:26:43 root@test02 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:51:24:43 brd ff:ff:ff:ff:ff:ff
    inet 192.168.234.101/24 brd 192.168.234.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3bdc:97e4:318d:cfba/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[20:26:46 root@test02 ~]#exit
logout
Connection to 192.168.234.101 closed.
[20:26:49 root@test01 ~]#

shell脚本格式

#!/bin/bash
ip=$1
username=$2
passwd=$3
expect << EOF
set timeout 20
spawn ssh $username@$ip 
expect {
        "yes/no" { send  "yes\n"; exp_continue }
        "password" { send "$passwd\n"  }
}
expect eof
EOF

shell脚本调用expect执行结果:

[21:44:05 root@test01 ~]#sh -x ssh.sh 192.168.234.101 root mage
+ ip=192.168.234.101
+ username=root
+ passwd=mage
+ expect
spawn ssh root@192.168.234.101
root@192.168.234.101's password: 
Last login: Sun Oct 31 21:42:38 2021 from 192.168.234.100
[21:44:10 root@test02 ~]#

2、生成10个随机数保存于数组中,并找出其最大值和最小值

#!/bin/bash
declare -i min max
declare -a nums
for ((i=0;i<10;i++));do#第一次取第0个数据,最小和最大值都是他本身。继续循环,在取第1个数据,去和第0个数据判断谁大,如果大于max,则赋值新的数据给max,否则和min进行比较,如果小于min>,则把新的数据赋值给min,其他数据不赋值,依次循环,直到i取到9,打印最终的max和min。
        nums[$i]=$RANDOM
        [ $i -eq 0 ] && min=${nums[0]} && max=${nums[0]} && continue
        [ ${nums[$i]} -gt $max ] && max=${nums[$i]} && continue
        [ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done
echo "All numbers are ${nums[*]}"
echo "Max is $max"
echo "Min is $min"

[22:27:09 root@test01 ~]#sh arr.sh 
All numbers are 7416 1808 15997 8906 12204 29804 25471 22347 13504 16552
Max is 29804
Min is 1808
[22:27:21 root@test01 ~]#sh arr.sh 
All numbers are 4611 11917 26709 20207 23253 22523 12690 3644 7895 19816
Max is 26709
Min is 3644
[22:27:22 root@test01 ~]#sh arr.sh 
All numbers are 2329 32290 8358 8388 18035 21923 30270 29207 20256 30949
Max is 32290
Min is 2329

3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序

语法
  declare(选项)(参数)
选项
  -:给变量舍得类型属性  
   +:取消变量的类型属性  
  -a:将变量声明为数组型  
  -i:将变量声明为整型  
  -x:将变量声明为环境变量  
  -r:将变量声明为只读变量 
  -p:查看变量的被声明的类型
#!/bin/bash
read -p "输入数组内数值的个数" count
#将变量声明为数组型
declare -a nums
#生成随机数数组
for ((i=0;i<$count;i++));do
        nums[$i]=$RANDOM
done
echo "原始数组:${nums[@]}"
#将变量声明为整型
declare -i n=$count
#根据数组的数量决定循环次数。
for ((i=0;i<n-1;i++));do
#内部循环,每次循环选出最小值。
    for ((j=0;j<n-1-i;j++));do
        let k=$j+1
#倒序,j和k进行比较,如果j小,则和k互换位置,依次循环,把第一趟的最小值换到最后1个位置。
        if (( ${nums[$j]} < ${nums[$k]} ));then
#x作为中间量,进行j和k的互换。
                x=${nums[$k]}
                nums[$k]=${nums[$j]}
                nums[$j]=$x
        fi
    done
done
echo "倒序后的数组为:${nums[*]}" 
for ((i=0;i<=n-1;i++));do
     for ((j=0;j<n-1-i;j++));do
         let k=j+1
         if (( ${nums[$j]} > ${nums[$k]} ));then
                x=${nums[$k]}
                nums[$k]=${nums[j]}
                nums[$j]=$x
         fi
    done
done
echo "正序后的数组为:${nums[*]}"
[19:14:24 root@test01 ~]#sh arr1.sh 
输入数组内数值的个数: 6
原始数组:29006 30736 5068 22609 22716 12899
倒序后的数组为:30736 29006 22716 22609 12899 5068
正序后的数组为:5068 12899 22609 22716 29006 30736

4、总结查看系统负载的几种命令,总结top命令的指标大概什么含义

查看系统负载的命令:
1, uptime 
2, top
3, w

在这里插入图片描述

第一行解释:
#和uptime命令执行结果一样
top - 19:50:26 up  1:03,  3 users,  load average: 0.06, 0.03, 0.05
load average:0.05, 0.05, 0.01:系统1分钟、5分钟、15分钟的CPU负载信息.
备注:load average后面三个数值的含义是最近1分钟、最近5分钟、最近15分钟系统的负载值。这个值的意义是,单位时间段内CPU活动进程数。如果你的机器为单核,那么只要这几个值均<1,代表系统就没有负载压力,如果你的机器为N核,那么必须是这几个值均<N才可认为系统没有负载压力。

第二行解释:
Tasks: 370 total,   2 running, 368 sleeping,   0 stopped,   0 zombie
370 total:当前有370个任务
2 running:2个任务正在运行
368 sleeping:368个进程处于睡眠状态
0 stopped:停止的进程数
0 zombie:僵死的进程数

第三行解释:
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
0.0%us:用户态进程占用CPU时间百分比
0.3%sy:内核占用CPU时间百分比
0.0%ni:renice值为负的任务的用户态进程的CPU时间百分比。nice是优先级的意思
99.7%id:空闲CPU时间百分比
0.0%wa:等待I/O的CPU时间百分比
0.0%hi:CPU硬中断时间百分比
0.0%si:CPU软中断时间百分比

第四行解释(free):
KiB Mem :  1868660 total,  1278252 free,   183340 used,   407068 buff/cache
1868660 total:物理内存总数
1278252 used: 使用的物理内存
183340 free:空闲的物理内存
407068 cached:用作缓存的内存

第五行解释:
KiB Swap:  2097148 total,  2097148 free,        0 used.  1486792 avail Mem
2097148 total:交换空间的总量
2097148 free:空闲的交换空间
0 used: 使用的交换空间
1486792 cached:缓存的交换空间

最后一行:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID:进程ID
USER:进程的所有者
PR:进程的优先级
NI:nice值
VIRT:占用的虚拟内存
RES:占用的物理内存
SHR:使用的共享内存
S:进行状态 S:休眠 R运行 Z僵尸进程 N nice值为负
%CPU:占用的CPU
%MEM:占用内存
TIME+: 占用CPU的时间的累加值
COMMAND:启动命令

5、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
for

#!/bin/bash
net=192.168.234

for ip in {1..254} ;
do
{
         ping -W1 -c 1 $net.$ip &> /dev/null && echo "ping $net.$ip is successed!" || echo "ping $net.$ip is failed!"
} &
done
wait

while

#!/bin/bash
net=192.168.234
i=1
while ((i<255));
do
{
ping -W1 -c 1 $net.$i &> /dev/null && echo "ping $net.$i is success" || echo "ping $net.$i is fail"
} &
let i+=1
done
wait
~    

6、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间

[21:58:04 root@test01 backup]#crontab -l
30 1 * * 1-5 /home/backup.sh
[21:58:22 root@test01 backup]#cat /home/backup.sh 
#!/bin/bash
/usr/bin/tar -cJPf  /backup/etcbak-`date -d yesterday +%F-%H`.tar.xz /etc/
[21:58:00 root@test01 backup]#ls
etcbak-2021-11-06-21.tar.xz
[21:58:28 root@test01 backup]#date +%F-%H
2021-11-07-21
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unix.shell编程是指使用Unix操作系统下的shell语言进行程序编写和脚本开发的一种编程方式。shell是一种命令行解释器,可以直接与操作系统内核进行交互。通过编写shell脚本,可以自动化执行一系列的命令、管理文件和进程、处理文本数据等操作。 《Unix.shell编程》一书是介绍Unix下shell编程的权威经典教材。编写这本书的目的是为了帮助读者深入了解Unix下的shell语言,提供一些常用编程技巧和最佳实践,并通过实例演示如何使用shell编写高效稳定的脚本。 在这本书中,作者首先介绍了shell的基本概念和语法规则,包括变量、条件语句、循环语句等。然后,详细讲解了如何编写具有实际应用场景的shell脚本,如文件操作、目录操作、文本处理、进程管理等。同时,还介绍了一些Unix系统命令的常用技巧和用法,如grep、awk、sed等。 此外,书中还涵盖了shell的高级特性,如函数定义、命令行参数处理、错误处理和调试技巧等,这些内容可以帮助读者更加灵活和高效地编写shell脚本。同时,书中还介绍了如何使用shell进行系统管理和日常运维工作,如定时任务、日志分析等。 总体来说,《Unix.shell编程》是一本很好的学习Unix下shell编程的参考教材。通过阅读和实践,读者可以掌握shell编程的基础知识和技巧,提高自己的编程能力。无论是系统管理员、开发人员还是脚本开发爱好者,都可以从中受益。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值