30个关于Shell脚本的经典案例(下)
本文目录
- #!/bin/bash
- if [ $# -ne 1 ]; then
- echo "Usage: $0 filename"
- fi
- dir=$(dirname $1)
- file=$(basename $1)
- ftp -n -v << EOF # -n 自动登录
- open 192.168.1.10 # ftp服务器
- user admin password
- binary # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误
- cd $dir
- get "$file"
- EOF
- #!/bin/bash
- COUNT=1
- SUM=0
- MIN=0
- MAX=100
- while [ $COUNT -le 5 ]; do
- read -p "请输入1-10个整数:" INT
- if [[ ! $INT =~ ^[0-9]+$ ]]; then
- echo "输入必须是整数!"
- exit 1
- elif [[ $INT -gt 100 ]]; then
- echo "输入必须是100以内!"
- exit 1
- fi
- SUM=$(($SUM+$INT))
- [ $MIN -lt $INT ] && MIN=$INT
- [ $MAX -gt $INT ] && MAX=$INT
- let COUNT++
- done
- echo "SUM: $SUM"
- echo "MIN: $MIN"
- echo "MAX: $MAX"
- 应用场景:希望将执行结果或者位置参数赋值给变量,以便后续使用。
- 方法1:
- for i in $(echo "4 5 6"); do
- eval a$i=$i
- done
- echo $a4 $a5 $a6
- 方法2:将位置参数192.168.1.1{1,2}拆分为到每个变量
- num=0
- for i in $(eval echo $*);do #eval将{1,2}分解为1 2
- let num+=1
- eval node${num}="$i"
- done
- echo $node1 $node2 $node3
- # bash a.sh 192.168.1.1{1,2}
- 192.168.1.11 192.168.1.12
- 方法3:
- arr=(4 5 6)
- INDEX1=$(echo ${arr[0]})
- INDEX2=$(echo ${arr[1]})
- INDEX3=$(echo ${arr[2]})
- 示例:
- # touch article_{1..3}.html
- # ls
- article_1.html article_2.html article_3.html
- 目的:把article改为bbs
- 方法1:
- for file in $(ls *html); do
- mv $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"); do
- mv $file bbs_${file#*_}
- done
- 方法3:
- # rename article bbs *.html
- 方法1:
- # find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}'
- 方法2:
- for size in $(ls -l *.html |awk '{print $5}'); do
- sum=$(($sum+$size))
- done
- echo $sum
- #!/bin/bash
- HOST=$1
- PORT="22 25 80 8080"
- for PORT in $PORT; do
- if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then
- echo "$PORT open"
- else
- echo "$PORT close"
- fi
- done
- Expect是一个自动交互式应用程序的工具,如telnet,ftp,passwd等。
- 需先安装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@$IP
- expect {
- \"(yes/no)\" {send \"yes\r\"; exp_continue}
- \"password:\" {send \"$PASS\r\"; exp_continue}
- \"$USER@*\" {send \"df -h\r exit\r\"; exp_continue}
- }"
- 方法3:将expect脚本独立出来
- 登录脚本:
- # cat 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.txt
- for ip in $(awk '{print $1}' $HOST_INFO)
- do
- user=$(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
- Linux主机SSH连接信息:
- # cat user_info.txt
- 192.168.1.120 root 123456
- Linux主机SSH连接信息:旧密码
- # cat old_pass.txt
- 192.168.18.217 root 123456 22
- 192.168.18.218 root 123456 22
- 内容格式:IP User Password Port
- SSH远程修改密码脚本:新密码随机生成
- https://www.linuxprobe.com/books
- #!/bin/bash
- OLD_INFO=old_pass.txt
- NEW_INFO=new_pass.txt
- for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); do
- USER=$(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_INFO
- expect -c "
- spawn ssh -p$PORT $USER@$IP
- set timeout 2
- expect {
- \"(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
- 生成新密码文件:
- # cat new_pass.txt
- 192.168.18.217 root n8wX3mU% 22
- 192.168.18.218 root c87;ZnnL 22
- 方法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++)); do
- for ((j=1;j<=i;j++)); do
- result=$(($i*$j))
- echo -n "$j*$i=$result "
- done
- echo
- done
- getopts是一个解析脚本选项参数的工具。
- 命令格式:getopts optstring name [arg]
- 初次使用你要注意这几点:
- 脚本位置参数会与optstring中的单个字母逐个匹配,如果匹配到就赋值给name,否则赋值name为问号;
- optstring中单个字母是一个选项,如果字母后面加冒号,表示该选项后面带参数,参数值并会赋值给OPTARG变量;
- optstring中第一个是冒号,表示屏蔽系统错误(test.sh: illegal option -- h);
- 允许把选项放一起,例如-ab
- 下面写一个打印文件指定行的简单例子,引导你思路:
- #!/bin/bash
- while getopts :f:n: option; do
- case $option in
- f)
- FILE=$OPTARG
- [ ! -f $FILE ] && echo "$FILE File not exist!" && exit
- ;;
- n)
- sed -n "${OPTARG}p" $FILE
- ;;
- ?)
- echo "Usage: $0 -f -n "
- echo "-f, --file specified file"
- echo "-n, --line-number print specified line"
- exit 1
- ;;
- esac
- done
根据工作经验总结的30个Shell脚本案例至此完结,都还是比较实用的,面试笔试题也经常会出。希望朋友们多动手练一练,让你的Shell功底上升一个段位!
30个关于Shell脚本的经典案例(下)的更多相关文章
- 30个关于Shell脚本的经典案例(上)
对于初学者而言,因为没有实战经验,写不出来Shell脚本很正常,如果工作了几年的运维老年还是写不出来,那就是没主动找需求,缺乏练习,缺乏经验.针对以上问题,总结了30个生产环境中经典的Shell脚本, ...
- 30个关于Shell脚本的经典案例(中)
本文目录 11.iptables自动屏蔽访问网站频繁的IP 12.判断用户输入的是否为IP地址 13.判断用户输入的是否为数字 14.给定目录找出包含关键字的文件 15.监控目录,将新创建的文件名追加 ...
- shell脚本仅列出当前目录下的文件及文件夹
#!/bin/bash function ergodic(){ ` # do # "/"$file ] # then # ergodic $"/"$file # ...
- shell脚本 批量转换目录下文件编码
发布:JB01 来源:脚本学堂 [大 中 小] 分享一例shell脚本,实现可以批量转换目录下的文件编码,很实用的一个小shell,有需要的朋友参考下.原文地址:http://www.jb ...
- Linux Shell脚本在service模式下的环境变量
普通Shell脚本在终端下运行时,环境变量来自于init/profile/.bash_profile等,就是在当前终端下可以得到的环境,比如PATH.在service模式下,脚本运行在受限的环境中:比 ...
- 30个Linux Shell脚本经典案例(上)
编写Shell过程中注意事项: 开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的 ...
- 多级菜单系统安装维护shell脚本实现企业级案例
演示效果: 1.一级菜单 2.二级菜单 3.执行操作 脚本参考: #!/bin/bash #author lic(oldboy linux student) #date 1304 DISK_NO=&q ...
- shell脚本编程测试类型下
一bash的数值测试 -v VAR变量VAR是否设置 数值测试:-gt 是否大于greater-ge 是否大于等于-eq 是否等于-ne 是否不等于 not equal-lt 是否小于-le 是否小 ...
- shell脚本杀掉指定进程下所有子进程(包括子进程的子进程)
搜索了网上好像并没有杀掉指定进程下所有子进程(包括子进程的子进程)的脚本,自己琢磨写了一版,虽说比较简单,但希望分享大家,帮助需要的人 #!/bin/sh # 递归找到进程最底层子进程并杀除. mai ...
随机推荐
- 运行时异常RuntimeException捕获的小测试
public class ExceptionTest { public static void main(String[] args) throws InterruptedException { ne ...
- Spark2.x(六十一):在Spark2.4 Structured Streaming中Dataset是如何执行加载数据源的?
本章主要讨论,在Spark2.4 Structured Streaming读取kafka数据源时,kafka的topic数据是如何被执行的过程进行分析. 以下边例子展开分析: SparkSession ...
- Better intuition for information theory
Better intuition for information theory 2019-12-01 21:21:33 Source: https://www.blackhc.net/blog/201 ...
- httpcomponents 发送get post请求
引入的包为: <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <de ...
- Xamarin.FormsShell基础教程(3)Shell项目构成
Xamarin.FormsShell基础教程(3)Shell项目构成 在创建的ShellDemo解决方案中,有3个子项目,分别为ShellDemo.ShellDemo.Android和ShellDem ...
- django入门7之django template和xadmin常用技巧
django入门7之django template和xadmin常用技巧 <li {% ' == '/course' %}class="active"{% endif %}& ...
- MathML
MathML https://developer.mozilla.org/en-US/docs/Web/MathML/Examples/MathML_Pythagorean_Theorem Mathe ...
- netstat -lunpt未找到命令
[root@localhost ~]# netstat -lunpt -bash: netstat: 未找到命令 [root@localhost ~]# yum -y install net-tool ...
- 【APM】Pinpoint 使用教程(二)
本例介绍Pinpoint使用教程 Pinpoint安装部署参考:[APM]Pinpoint 安装部署(一) 查看应用调用关系拓扑图 进入pintpoint->选择应用-〉选择查看的时间周期,即可 ...
- LeetCode_459. Repeated Substring Pattern
459. Repeated Substring Pattern Easy Given a non-empty string check if it can be constructed by taki ...