案例2:字符串初值的处理
2.1 问题
本案例要求编写一个脚本sumx.sh,求从1-x的和,相关要求如下:
• 从键盘读入x值
• 当用户未输入任何值时,默认按1计算
2.2 方案
通过 v a r : − w o r d 判 断 变 量 是 否 存 在 , 决 定 变 量 的 初 始 值 。 2.3 步 骤 实 现 此 案 例 需 要 按 照 如 下 步 骤 进 行 。 步 骤 一 : 认 识 字 符 串 初 值 的 最 常 见 处 理 方 法 1 ) 只 取 值 , {var:-word}判断变量是否存在,决定变量的初始值。 2.3 步骤 实现此案例需要按照如下步骤进行。 步骤一:认识字符串初值的最常见处理方法 1)只取值, var:−word判断变量是否存在,决定变量的初始值。2.3步骤实现此案例需要按照如下步骤进行。步骤一:认识字符串初值的最常见处理方法1)只取值,{var:-word}
若变量var已存在且非Null,则返回 $var 的值;否则返回字串“word”,原变量var的值不受影响。
变量值已存在的情况:
- [root@svr5 ~]# XX=11
- [root@svr5 ~]# echo $XX //查看原变量值
- 11
- [root@svr5 ~]# echo ${XX:-123} //因XX已存在,输出变量XX的值
- 11
变量值不存在的情况: - [root@svr5 ~]# echo ${YY:-123} //因YY不存在,输出“123”
- 123
编写一个验证知识点的参考示例脚本如下: - [root@svr5 ~]# cat /root/test.sh
- #!/bin/bash
- read -p “请输入用户名:” user
- [ -z $user ] && exit //如果无用户名,则脚本退出
- read -p “请输入密码:” pass
- pass=${pass:-123456} //如果用户没有输入密码,则默认密码为123456
- useradd $user
- echo “$pass” | passwd --stdin $user
步骤二:编写sumx.sh脚本,处理read输入的初值
用来从键盘读入一个正整数x,求从1到x的和;当用户未输入值(直接回车)时,为了避免执行出错,应为x赋初值1 。
1)脚本编写参考如下 - [root@svr5 ~]# vim sumx.sh
- #!/bin/bash
- read -p “请输入一个正整数:” x
- x=${x:-1}
- i=1; SUM=0
- while [ $i -le $x ]
- do
-
let SUM+=i
-
let i++
- done
- echo “从1到 x 的 总 和 是 : x的总和是: x的总和是:SUM”
- [root@svr5 ~]# chmod +x sumx.sh
2)验证、测试脚本执行效果: - [root@svr5 ~]# ./sumx.sh
- 请输入一个正整数:25 //输入25,正常读入并计算、输出结果
- 从1到25的总和是:325
- [root@svr5 ~]# ./sumx.sh
- 请输入一个正整数:70 //输入70,正常读入并计算、输出结果
- 从1到70的总和是:2485
- [root@svr5 ~]# ./sumx.sh
- 请输入一个正整数: //直接回车,设x=1后计算、输出结果
- 从1到1的总和是:1
3 案例3:expect预期交互
3.1 问题
本案例要求编写一个expect脚本,实现SSH登录的自动交互:
• 提前准备好目标主机,IP地址为192.168.4.5
• 执行脚本后自动登入,并且在目标主机建立测试文件 /tmp/mike.txt
3.2 方案
expect可以为交互式过程(比如FTP、SSH等登录过程)自动输送预先准备的文本或指令,而无需人工干预。触发的依据是预期会出现的特征提示文本。
储备知识(发送邮件的几种方式):
- [root@svr5 ~]# echo “test mail” | mail -s test root
- [root@svr5 ~]# mail -s test root < /etc/passwd
- [root@svr5 ~]# mail -s test root << EOF
- test mail
- hell world
- EOF
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:准备expect及SSH测试环境
1)安装expect工具 - [root@svr5 ~]# yum -y install expect //安装expect
- … …
- Installed:
- expect.x86_64 0:5.44.1.15-5.el6_4
- Dependency Installed:
- tcl.x86_64 1:8.5.7-6.el6
- [root@svr5 ~]# which expect //确认expect路径
- /usr/bin/expect
步骤二:编写脚本,实现免交互登录
1)任务需求及思路分析
在SSH登录过程中,如果是第一次连接到该目标主机,则首先会被要求接受密钥,然后才提示输入密码:
注意:不要照抄这里的IP地址,需要根据自己的实际IP填写!!! - [root@svr5 ~]# ssh [email protected] //连接目标主机
- The authenticity of host ‘192.168.4.5 (192.168.4.5)’ can’t be established.
- RSA key fingerprint is 58:a0:d6:00:c7:f1:34:5d:6c:6d:70:ce:e0:20:f8:f3.
- Are you sure you want to continue connecting (yes/no)? yes //接受密钥
- Warning: Permanently added ‘192.168.4.5’ (RSA) to the list of known hosts.
- [email protected]’s password: //验证密码
- Last login: Thu May 7 22:05:44 2015 from 192.168.4.5
- [root@svr5 ~]$ exit //返回客户端
- logout
- Connection to 192.168.4.5 closed.
当然,如果SSH登录并不是第一次,则接受密钥的环节就没有了,而是直接进入验证密码的过程:
注意:不要照抄这里的IP地址,需要根据自己的实际IP填写!!! - [root@svr5 ~]# ssh [email protected] //连接目标主机
- [email protected]’s password: //验证密码
- Last login: Mon May 11 12:02:39 2015 from 192.168.4.5
- [root@svr5 ~]$ exit //返回客户端
- logout
- Connection to 192.168.4.5 closed.
2)根据实现思路编写脚本文件
脚本内容参考如下版本1:
注意:不要照抄脚本里的IP地址与密码,需要根据自己的实际情况填写!!! - [root@svr5 ~]# vim expect_ssh.sh
- #!/bin/bash
- expect << EOF
- spawn ssh 192.168.4.5 #//创建交互式进程
- expect “password:” { send “123456\r” } #//自动发送密码
- expect “#” { send “touch /tmp.txt\r” } #//发送命令
- expect “#” { send “exit\r” }
- EOF
- [root@svr5 ~]# chmod +x expect_ssh.sh
通过循环批量操作,版本2:
注意:不要照抄脚本里的IP地址与密码,需要根据自己的实际情况填写!!! - [root@svr5 ~]# vim expect_ssh.sh
- #!/bin/bash
- for i in 10 11 #注意IP根据实际情况填写
- do
- expect << EOF
- spawn ssh 192.168.4.$i #//创建交互式进程
- expect “password:” { send “123456\r” } #//自动发送密码
- expect “#” { send “touch /tmp.txt\r” } #//发送命令
- expect “#” { send “exit\r” }
- EOF
- done
- [root@svr5 ~]# chmod +x expect_ssh.sh
注意事项:
expect脚本的最后一行默认不执行
如果不希望ssh时出现yes/no的提示,远程时使用如下选项:
#ssh -o StrictHostKeyChecking=no server0