第十二章 Shell脚本编写及常见面试题(三)

本章目录:

wKiom1kuG2Dij8H6AAAuNhrwFhc739.png

12.21 FTP下载文件

#!/bin/bash
if [ $# -ne 1 ]; thenecho "Usage: $0 filename"
fi
dir=$(dirname $1)
file=$(basename $1)
ftp -n -v << EOF   # -n 自动登录
open 192.168.1.10
user admin adminpass
binary   # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误
cd $dir
get "$file"
EOF

12.22 输入五个100数之内的字符,统计和、最小和最大

COUNT=1
SUM=0
MIN=0
MAX=100
while [ $COUNT -le 5 ]; doread -p "请输入1-10个整数:" INTif [[ ! $INT =~ ^[0-9]+$ ]]; thenecho "输入必须是整数!"exit 1elif [[ $INT -gt 100 ]]; thenecho "输入必须是100以内!"exit 1fiSUM=$(($SUM+$INT))[ $MIN -lt $INT ] && MIN=$INT[ $MAX -gt $INT ] && MAX=$INTlet COUNT++
done
echo "SUM: $SUM"
echo "MIN: $MIN"
echo "MAX: $MAX"

wKioL1kuHZCQQNrOAAAloooYaNM429.png

12.23 将结果分别赋值给变量

方法1:
for i in $(echo "4 5 6"); doeval a$i=$i
done
echo $a4 $a5 $a6
方法2:将位置参数192.168.18.1{1,2}拆分为到每个变量
num=0
for i in $(eval echo $*);do   #eval将{1,2}分解为1 2let num+=1eval node${num}="$i"
done
echo $node1 $node2 $node3
# bash a.sh 192.168.18.1{1,2}
192.168.18.11 192.168.18.12
方法3:
arr=(4 5 6)
INDEX1=$(echo ${arr[0]})
INDEX2=$(echo ${arr[1]})
INDEX3=$(echo ${arr[2]})

12.24 批量修改文件名

# touch article_{1..3}.html
# ls
article_1.html  article_2.html  article_3.html
现在想把article改为bbs:
方法1:
for file in $(ls *html); domv $file bbs_${file#*_}# mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')# mv $file $(echo $file |echo bbs_$(cut -d_ -f2) 
done
方法2:
for file in $(find . -maxdepth 1 -name "*html"); domv $file bbs_${file#*_}
done
方法3:
# rename article bbs *.html

12.25 统计当前目录中以.html结尾的文件总大小

方法1:
# find . -name "*.html" -maxdepth 1 -exec du -b {} \; |awk '{sum+=$1}END{print sum}'
方法2:
for size in $(ls -l *.html |awk '{print $5}'); dosum=$(($sum+$size))
done
echo $sum
递归统计:
# find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}'

12.26 扫描主机端口状态

#!/bin/bash
HOST=$1
PORT="22 25 80 8080"
for PORT in $PORT; doif echo &>/dev/null > /dev/tcp/$HOST/$PORT; thenecho "$PORT open"elseecho "$PORT close"fi
done

wKiom1kuIdyj5UkEAAAONQjBJ3c657.png

12.27 Expect实现SSH免交互执行命令

需要先安装expect工具。

expect涉及用法说明:

命令描述

set可以设置超时,也可以设置变量

timeout超时等待时间,默认10s

spawn执行一个命令

expect ""匹配输出的内容

exp_continue继续执行下面匹配

\r回车

$argc统计位置参数数量

[lindex $argv 0]位置参数

puts打印字符串,类似于echo

expect{...}输入多行记录

方法1:EOF标准输出作为expect标准输入

#!/bin/bash
USER=root
PASS=123.com
IP=192.168.1.120
expect << EOF
set timeout 30
spawn ssh $USER@$IP   
expect {"(yes/no)" {send "yes\r"; exp_continue}"password:" {send "$PASS\r"}
}
expect "$USER@*"  {send "$1\r"}
expect "$USER@*"  {send "exit\r"}
expect eof 
EOF

方法2:

#!/bin/bash
USER=root
PASS=123.com
IP=192.168.1.120
expect -c "spawn ssh $USER@$IPexpect {\"(yes/no)\" {send \"yes\r\"; exp_continue}\"password:\" {send \"$PASS\r\"; exp_continue}\"$USER@*\" {send \"df -h\r exit\r\"; exp_continue}}"

方法3:将expect脚本独立出来

login.exp登录文件:

#!/usr/bin/expect 
set ip [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2]
set cmd [lindex $argv 3]
if { $argc != 4 } {
puts "Usage: expect login.exp ip user passwd"
exit 1
}
set timeout 30
spawn ssh $user@$ip
expect {"(yes/no)" {send "yes\r"; exp_continue}"password:" {send "$passwd\r"}
}
expect "$user@*"  {send "$cmd\r"}
expect "$user@*"  {send "exit\r"}
expect eof

执行命令脚本:

#!/bin/bash
HOST_INFO=user_info
for ip in $(awk '{print $1}' $HOST_INFO)
douser=$(awk -v I="$ip" 'I==$1{print $2}' $HOST_INFO)pass=$(awk -v I="$ip" 'I==$1{print $3}' $HOST_INFO)expect login.exp $ip $user $pass $1
done

SSH连接信息文件:

# cat user_info 

192.168.1.120 root 123456

12.28 批量修改服务器用户密码

旧密码SSH主机信息old_info文件:

#     ip     user    passwd    port

#--------------------------------------

192.168.18.217  root    123456     22

192.168.18.218  root    123456     22

修改密码脚本:

#!/bin/bash
OLD_INFO=old_info
NEW_INFO=new_info
for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); doUSER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)NEW_PASS=$(mkpasswd -l 8)echo "$IP   $USER   $NEW_PASS   $PORT" >> $NEW_INFOexpect -c "spawn ssh -p$PORT $USER@$IPset timeout 2expect {\"(yes/no)\" {send \"yes\r\";exp_continue}\"password:\" {send \"$PASS\r\";exp_continue}\"$USER@*\" {send \"echo \'$NEW_PASS\' |passwd --stdin $USER\r exit\r\";exp_continue}}"
done

生成新密码new_info文件:

192.168.18.217  root    n8wX3mU%        22

192.168.18.218  root    c87;ZnnL        22

12.29 打印乘法口诀

方法1:
# awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}'
方法2:
for ((i=1;i<=9;i++)); dofor ((j=1;j<=i;j++)); doresult=$(($i*$j))echo -n "$j*$i=$result "doneecho
done

wKioL1kuHgrQ_XPxAABhsSZCEJg877.png-wh_50

12.30 getopts工具完善脚本命令行参数

getopts是一个解析脚本选项参数的工具。

命令格式:getopts optstring name [arg]

初次使用你要注意这几点:

1)脚本位置参数会与optstring中的单个字母逐个匹配,如果匹配到就赋值给name,否则赋值name为问号;

2)optstring中单个字母是一个选项,如果字母后面加冒号,表示该选项后面带参数,参数值并会赋值给OPTARG变量;

3)optstring中第一个是冒号,表示屏蔽系统错误(test.sh: illegal option -- h);

4)允许把选项放一起,例如-ab

下面写一个打印文件指定行的简单例子,用于引导你思路,扩展你的脚本选项功能:

#!/bin/bash
while getopts :f:n: option; docase $option in f)FILE=$OPTARG[ ! -f $FILE ] && echo "$FILE File not exist!" && exit;;n)sed -n "${OPTARG}p" $FILE;;?)echo "Usage: $0 -f <file_path> -n <line_number>"echo "-f, --file           specified file"echo "-n, --line-number    print specified line"exit 1;;esac
done

wKioL1kuID3zfLJWAAAeiazGKzY694.png

思路扩展:限定脚本参数,将参数保存变量,下面调用变量继续操作。


本章写的Shell脚本例子都比较实用,在面试题中也经常出现,希望大家多动手练习,不要复制粘贴就拿来跑,这样是学不会的!有问题请加群交流:323779636(Shell/Python运维开发群)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

省选前的考试记录

日拱一卒功不唐捐 什么沙雕玩意儿 2018.12.24 T1 如果对 \(A\) 数组求出来高度递减的单调栈的话&#xff0c;会发现只有单调栈里的元素是有用的。因为如果有 \(A[i]<A[j] \And i<j\)&#xff0c;那电梯就可以在带 \(j\) 上楼的时候顺便把 \(i\) 带上并不会影响结果。所以…

[Jinkey 原创]震惊!iOS 系统居然自带悬浮窗口调试工具

原文链接 : 震惊&#xff01;iOS 系统居然自带悬浮窗口调试工具 —— Jinkey 原创原文作者 : Jinkey1 背景 英文原文&#xff1a;http://ryanipete.com/blog/ios/swift/objective-c/uidebugginginformationoverlay/ 我写得这个并不是翻译而是用自己的理解重新表述这个功能&…

边分治讲解

前言&#xff1a; 边分治和点分治一样属于树分治的一部分&#xff0c;相比于点分治&#xff0c;边分治对于与度数相关的问题有着很大的优势&#xff0c;同时边分治也是解决树上最优化问题的一种重要的算法。 分治过程&#xff1a; 边分治的分治过程与点分治类似&#xff0c;同样…

Pycharm社区版配置Django

Pycharm开发版(收费)自带Django模板&#xff0c;社区版(免费)需要通过命令行创建Django项目。 通过pip安装Django&#xff1a;pip install django2.0.2(版本号)&#xff0c;可通过以下命令检查是否安装成功 在命令行下创建Django项目(项目存放在D:\PyCharm) 1.创建项目 进入D:\…

用Mesos分布式架构进行工作

引言&#xff1a;2010年&#xff0c;一个旨在解决扩容问题的项目诞生——Apache Mesos&#xff0c;它在某种程度上对CPU、内存、磁盘资源进行抽象&#xff0c;从而允许整个数据中心如同单台大服务器般运转。无需虚拟机和操作系统&#xff0c;Mesos创造了一个单独底层的集群为应…

不一样的视角,程序员世界里的环保

摘要&#xff1a; 我们身边有很多可以做的技术环保工作。比如说&#xff0c;在Linux下少用root用户&#xff0c;SQL的时候&#xff0c;delete前先select&#xff0c;这样&#xff0c;你就不会做出一些让你后悔的事。不会让你重头来过&#xff0c;从而至少不会浪费电能。写代码的…

oracle 会话 lock,相克军_Oracle体系_随堂笔记014-锁 latch,lock

1、Oracle锁类型锁的作用latch锁&#xff1a;chain&#xff0c;链LOCK锁排他锁(X)共享锁(S)2、行级锁&#xff1a;DML语句事务锁TX锁的结构事务锁的加锁和解锁过程只有排他锁不影响读(CR块)3、表级锁&#xff1a;TM行级排他锁(Row exclusive)RX锁当我们进行DML时&#xff0c;会…

TIOBE 10月编程语言排行榜 : GO 问鼎本年度语言 ?

距离2016年度编程语言的公布只剩3个月了&#xff0c;谁将夺得桂冠&#xff1f; 与去年同期相比&#xff0c;2016年只有Go语言和Groovy语言的增长率超过了1%。 需要注意的是&#xff0c;Groovy语言2015年以一个爆炸性增长的收尾&#xff0c;所以到2017年1月左右的增长速度可能不…

使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范

StyleCop 可以帮助强制执行代码格式化规范&#xff0c;ReSharper 可以帮助你更高效地编写代码。把两者结合起来&#xff0c;你便能高效地编写符合团队强制格式化规范的代码来。 本文就介绍如何使用 ReSharper 来高效地遵循 StyleCop 的代码格式化规范。 本文内容 安装插件 Styl…

C# 控件双缓冲控制 ControlStyles 枚举详解

ControlStyles 枚举.NET Framework 4指定控件的样式和行为。 此枚举有一个 FlagsAttribute 特性&#xff0c;通过该特性可使其成员值按位组合。 命名空间&#xff1a; System.Windows.Forms程序集&#xff1a; System.Windows.Forms&#xff08;在 System.Windows.Forms.dll …

Java 9 将采用新的版本字符串格式

在现有的版本编码格式使用了两年之后&#xff0c;从Java 9开始&#xff0c;Java版本方案将根据业内软件版本编码的最佳实践进行修改。使用或解析Java版本字符串的应用程序开发人员要注意了&#xff0c;因为这种变化可以会影响他们的应用程序。 正如JEP 223所阐述的那样&#xf…

jQuery(爱前端)

一 jQuery 简介 官网&#xff1a;www.jquery.com 口号&#xff1a;写更少的代码&#xff0c;做更多的事情 jQuery 是一个快速、小型的、特性很多的JS库&#xff0c;它把很多事儿都变得简单。jQuery是免费的、开源的。 jQuery 是 DOM 编程领域的霸主&#xff0c;极大的简化了原生…

CentOS 7 firewalld使用简介

2019独角兽企业重金招聘Python工程师标准>>> Centos升级到7之后&#xff0c;发现无法使用iptables控制Linuxs的端口&#xff0c;google之后发现Centos 7使用firewalld代替了原来的iptables。下面记录如何使用firewalld开放Linux端口&#xff1a; 1.快速使用说明 开启…

一个备份sql server文件.bak还原成两个数据库

一直对这个概念很模糊&#xff0c;今天具体一点。 备份文件只要是正常的.bak文件就好。 数据库>还原数据库 直接填写还原之后的文件名就行。 用一份备份文件还原两个一样的库&#xff0c;只是名称不一样。 转载于:https://www.cnblogs.com/Ly426/p/10209825.html

linux服务器防病毒,Linux系统中你不需要防病毒?_服务器评论-中关村在线

误区4&#xff1a;Linux是无病毒。Linux的安全性这么好&#xff0c;这是否意味着Linux是无病毒吗&#xff1f;现实&#xff1a;Linux是非常安全&#xff0c;并不是没有针对Linux方面的病毒。有许多针对Linux的已知病毒。但是几乎所有的已知病毒对于Linux在本质上都是非破坏性的…

python面向对象-1方法、构造函数

类是指&#xff1a;描述一种事物的定义&#xff0c;是个抽象的概念 实例指&#xff1a;该种事物的一个具体的个体&#xff0c;是具体的东西 打个比方&#xff1a; “人”是一个类。“张三”是人类的一个具体例子 在编程时也是同样的道理&#xff0c;你先自己定义一个“类”&am…

bzoj3503: [Cqoi2014]和谐矩阵

高斯消元解异或方程组。学了bitset。对比如下 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define REP(i,s,t) for(int is;i<t;i) #define dwn(i,s,t) for(int is;i>t;i--) #define clr(…

sys模块

与python解释器交互的模块 sys.argv 命令行参数List&#xff0c;第一个元素是程序本身路径 sys.exit(n) 退出程序&#xff0c;正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径…

Oracle中SQL语句学习五(统计分组语句group by和having)

oracle&#xff08;41&#xff09; 在 应用系统开发中&#xff0c;进行需要统计数据库中的数据&#xff0c;当执行数据统计时&#xff0c;需要将表中的数据进行分组显示&#xff0c;在统计分组中是通过group by子句、分组函数、having子句共同实现的。其中group by子句用于指定…