潍坊网站建设wf3,展示网站模版源码,厚街镇网站建设,做网站赔钱了一、Linux系统免除交互操作方法
1、EOF多文本输入
案例#xff1a;为机器磁盘进行分区并实现挂载#xff0c;免交互式操作#xff0c;如何实现#xff1f;
#!/bin/bash
fdisk /dev/sdb EOF
n
p
1
wq
EOFmkfs.xfs /dev/sdb1 mkdir -p /data 为机器磁盘进行分区并实现挂载免交互式操作如何实现
#!/bin/bash
fdisk /dev/sdb EOF
n
p
1
wq
EOFmkfs.xfs /dev/sdb1 mkdir -p /data mount /dev/sdb1 /data
echo /dev/sdb1 /data xfs defaults 0 2 /etc/fstab# 与 echo -e n\np | fdisk /dev/sdb 方式一样
2、标准输出和错误输出重定向 “ file 21”
注意有些命令的交互操作提示是不算在标准输出和错误输出中的此时该方法不适用
ssh root10.11.20.xxx -o StrictHostKeyCheckingno logfile 21
status_info$( cat logfile )case ${status_info} in
*Connection refused*)echo 正在执行ssh连接主机${host}ssh连接拒绝请检查ssh服务是否开启;;*)echo ssh连接中附在脚本中如何替代Ctrl C等关闭命令的终端窗口
注意命令的交互操作提示是不算终端窗口的此时该方法不适用
例如可以通过以下方式将telnet命令关闭sleep 1 | telnet 127.0.0.1 10050echo -e \n | telnet 10.127.0.0.1 10050echo | telnet 127.0.0.1 10050telnet 127.0.0.1 10050 /dev/null 代表标准输入为空
3、Expect工具
一. expect 简介 expect 工具是一个根据脚本与其他交互式程序进行交互。通过在脚本中设定期望值和响应值进行交互操作。主要应用于执行命令和程序时系统以交互形式要求输入指定字符串实现交互通信。 解释型语言提供分支和高级控制结构引导对话。此外用户可以在需要时直接进行控制和交互然后将控制权返回给脚本。 简单来说expect工具可以控制、处理输入输出流然后提供自动填写数据等需要用户交互式输入的数据的地方实现自动化处理。Expect就是为了处理“自动交互”的工具。
二. expect工作原理
spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出。
三. 基本语法
expect 启动选项
-c 执行脚本前先执行的命令可多次使用
-d debug模式可以在运行时输出一些诊断信息与在脚本开始处使用exp_internal 1相似。
-D 启用交换调式器,可设一整数参数。
-f 从文件读取命令仅用于使用#!时。如果文件名为-则从stdin读取(使用./-从文件名为-的文件读取)。
-i 交互式输入命令使用exit或EOF退出输入状态
-- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时)可放到#!行:#!/usr/bin/expect --
-v 显示expect版本信息expect 命令参数
spawn 交互程序开始执行后面的命令或程序。set timeout n 设置超时时间表示该脚本代码需在n秒钟内完成如果超过则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。如果设置为-1表示不会超时set 定义变量也可以使用set var [xxx]方式 命令置换[][ ]内是独立的TCL指令使用不同的TCL指令可实现各种获取变量的效果。例如set CommandList [lindex $argv 3]#获取命令列表分号分隔set cmds [split $CommandList ;]#获取命令列表长度set cmds_num [llength $cmds]$argv expect脚本可以接受bash的外部传参可以使用[ lindex $argv n ]n为0表示第一个传参为1表示第二个传参以此类推expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互否则等待timeout秒后自动退出expect语句send 如果匹配到expect接受到的信息就将send中的指令交互传递执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查exp_continue 表示循环式匹配通常匹配之后都会退出语句但如果有exp_continue则可以继续执行下面的匹配。例如ssh需要先匹配yes/no再匹配passoword。yes/no { send yes\r; exp_continue}password: { send $passwd\r }exit 退出expect脚本expect eof spawn进程结束后会向expect发送eof接收到eof代表该进程结束interact 执行完代码后保持交互状态将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上send_user 用来打印expect脚本中的信息类似shell里的echo命令puts 输出变量打印字符串类似于echo
注释puts在输出字符串的尾部自动添加换行符而send_user不会自动添加除了换行符外如果在Expect脚本中使用日志文件则通过发送的语句send_user会将其放入日志文件而通过发送的语句puts则不会。
四、案例介绍
[rootlocalhost ~]# vim test.sh 一般将expect脚本的后缀命名为.sh#!/usr/bin/expect expect的解析器与shell中的#!/bin/bash类似
set timeout n 设置超时时间n秒表示下面的代码需在n秒钟内完成(-1代表永不超时)如果超过则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住
set name 12345 set设置变量name的值为123456spawn command1 command2.. 执行命令也可以将变量作为命令输入
expect{ 接受执行命令返回的信息accept1 {send instruction1\r; exp_continue} 匹配到accest1发送instruction1 指令并且\r 回车执行accept2 {send instruction2\r; exp_continue} 匹配到accest2发送instruction2 指令并且\r 回车执行exp_continue表示循环匹配accept3 {send \r; exp_continue} 匹配到accept3表示直接回车执行accept4 {send $name\r} 匹配到accept4,将变量值作为指令并且回车执行
}expect eof 结束这个进程 二、SSH批量修改主机密码脚本实现
shell脚本使用expect自动化交互工具完成密码修改
cat change_password.sh
#!/bin/bash
host_list(127.0.0.1 127.0.0.2)
logfile/tmp/change_password.log
old_pawdpassword1
new_pawdpassword2function change_password(){ #case函数匹配条件中可以使用某些简单的正则匹配字符需测试,特殊字符使用\转义case ${status_info} in*Connection refused*)echo ssh端口不通请检查ssh服务是否开启;;*)echo ssh端口访问正常开始执行expect自动化交互操作/usr/bin/expect ./use_ssh.sh ${host} ${old_pawd} ${new_pawd}esac}for host in ${host_list[]}
do# /dev/null代表标准输入为空作用关闭终端窗口$( telnet ${host} 22 /dev/null ${logfile} 21 )status_info$( cat ${logfile} )change_password
done
expect自动化交互脚本
#!/usr/bin/expect
#set timeout 30#定义变量
set HostIP [lindex $argv 0]
set old_pawd [lindex $argv 1]
set new_pawd [lindex $argv 2]
set Command passwd root# puts 旧密码为${old_pawd}新的为${new_pawd};#执行ssh命令-o参数忽略第一次的yes/no选择
spawn ssh -l root ${HostIP} -o StrictHostKeyCheckingno expect {# 第一次连接输入密码Password: { send ${old_pawd}\r;exp_continue }# 输入密码错误会再次提示*Password:* { send_user 主机${HostIP}登录密码错误请检查登录密码;expect eofexit 2}# 登陆成功命令行界面修改密码# {send ${Command}\r;}Enter new password: {send_user 输入的新密码为${new_pawd}send ${new_pawd}\r;}Re-type new password: {send_user 再次输入新密码${new_pawd}send ${new_pawd}\r;}passwd: password updated successfully {send_user 主机${HostIP}修改密码成功;send exit\r}
}sleep 1
send exit\rexpect eofexit