第十二章 Shell脚本编写及常见面试题(三)
本章目录:
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"
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
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
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
思路扩展:限定脚本参数,将参数保存变量,下面调用变量继续操作。
本章写的Shell脚本例子都比较实用,在面试题中也经常出现,希望大家多动手练习,不要复制粘贴就拿来跑,这样是学不会的!有问题请加群交流:323779636(Shell/Python运维开发群)
第十二章 Shell脚本编写及常见面试题(三)相关推荐
- Shell脚本编写及常见面试题
注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 4)默认变量是全局的,在函 ...
- 第二十二章 SHELL脚本-CENTOS7.5知识
shell脚本(二) 变量的作用 为灵活管理Linux系统提供特定参数,有两层意思:系统配置和用户设置. 变量名:使用固定的名称,由系统预设或用户定义 变量值:能够根据用户设置.系统环境的变化 ...
- 面试常用shell脚本_Shell脚本编写及常见面试题
注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 4)默认变量是全局的,在函 ...
- linux 第十五章 shell 脚本习题
编写shell脚本,计算1-100的和: #! /bin/bash # sum 1-100 sum=0 for i in `seq 1 100`;do sum=$[$sum+$i] done echo ...
- 第二十四章 SHELL脚本-CENTOS7.5知识
shell脚本(四) 程序结构: IF结构.for结构.while结构.case结构 1.分支结构 2.分支示例 case语句编写 #!/bin/bash case $1 in anquan) ech ...
- Linux基本功十二:shell脚本流程控制
bash中的流程控制,设计到判断 [ ] , if || && switch-case do-while until for 函数()等等 (1)判断[] -r -w -b - ...
- 第二集 第一魂环 第十二章
第二集 第一魂环 第十二章 乱披风锤法(一) 门口的两名门卫看上去都是二十岁左右的样子,身上的魂力波动并不明显,感觉上,似乎连魂师的级别都没有达到.看来,诺丁城果然是偏僻,从武魂殿的级别就能看出这座城 ...
- 【鸟哥的Linux私房菜】第十二章、学习shell脚本
第十二章.学习shell脚本 以下皆为实践题,请自行编写出程序 请建立一个脚本,当你执行该脚本的时候,该脚本可以显示:(1)你目前的身份(用 whoami) (2)你目前所在的目录(用pwd) #!/ ...
- linux脚本求命令行上整数和,《Linux命令行与shell脚本编程大全》 第二十二章 学习札记...
<Linux命令行与shell脚本编程大全> 第二十二章 学习笔记 第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系 ...
最新文章
- 最常用 150 个Linux命令汇总(建议收藏)
- 玩转Python!一文详述Python 的高性能使用技巧
- ERP项目中一个表应该有哪些默认字段
- Python第一周 学习笔记(1)
- 2020-11-19(栈帧)
- 教你以 4G 的速度克隆 Github 项目!
- python中文开发环境_Eclipse搭建Python开发环境+Python中文处理
- java 中的内省 introspector
- 数据库-优化-数据库系统配置优化-配置文件优化
- 【详解】Java语言的特点以及Java语言与C/C++的比较
- stanford python中文分词
- [js] innerHTML与outerHTML有什么区别?
- mysql存储过程知识点_知识点:Mysql 基本用法之存储过程
- ibm笔记本电脑电池_笔记本电脑是一直插着电源好,还是拔了电源好?
- Material Design控件使用
- 移动Web实战篇-使用CSS Sprites减少你的页面http请求
- 苹果电脑删除linux系统软件,mac删除双系统_mac删除双系统的win
- 神策分析 Android SDK 之用户路径采集
- ONNX 推理yolov5车牌关键点检测 crnn 车牌识别
- Multisim函数发生器设置问题
热门文章
- c/c++ 编程试题
- Visual Studio进行linux远程开发
- php常量变量连接,PHP常量及变量区别原理详解
- numpy 归一化_归一化(MinMax)和标准化(Standard)的区别
- uva 1626——Brackets sequence
- uva 12627——Erratic Expansion
- CString string 转换
- 大型网站服务器 pdf,大型网站服务器容量规划[PDF][145.25MB]
- 二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)
- c++中利用STL实现公司员工分组问题