Shell

您所在的位置:网站首页 bash和shell的调用 Shell

Shell

2023-03-01 01:04| 来源: 网络整理| 查看: 265

 安装expect工具

expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程是:

spawn启动指定进程 -> expect获取指定关键字 -> send想指定进程发送指定指令 -> 执行完成, 退出.

由于expect是基于tcl的, 所以需要确保系统中安装了tcl:

# 检查是否安装了tcl: [root@localhost ~]# whereis tcl tcl: /usr/lib64/tcl8.5 /usr/include/tcl.h /usr/share/tcl8.5 # 如果没有安装, 使用yum安装tcl和expect: [root@localhost ~]# yum install -y tcl [root@localhost ~]# yum install -y expect # 查看expect的安装路径: [root@localhost ~]# command -v expect /usr/bin/expect

  

expect的常用命令 命 令 说 明 spawn 启动新的交互进程, 后面跟命令或者指定程序 expect 从进程中接收信息, 如果匹配成功, 就执行expect后的动作 send 向进程发送字符串 send exp_send 用于发送指定的字符串信息 exp_continue 在expect中多次匹配就需要用到 send_user 用来打印输出 相当于shell中的echo interact 允许用户交互 exit 退出expect脚本 eof expect执行结束, 退出 set 定义变量 puts 输出变量 set timeout 设置超时时间 Expect中最关键的四个命令是send,expect,spawn,interact。 简单的用法,稍作修改就可以变成很实用都脚本。 #!/usr/bin/expect -f #用expect实现自动交互 #期望的字符串必须出现,而且必须按顺序出现,send记得带上换行符 #指定要启动的命令,可以带参数 spawn ./hello.sh v1 v2 #可以设置超时,默认的超时就是10秒 set timeout 11 #一问一答的节奏,expct期望一个字符串,然后send回应一个字符串 expect "(yes/no)" send "yes\r" expect "password:" send "no-password\n" #期望的字符串是正则匹配的,发送要记得换行符,\r和\n都行 expect "*num" send "1\n" #等着命令结束后退出 expect eof 例1:远程登录并创建文件后退出

 

#!/usr/bin/expect ##注意路径,使用 [whereis expect] 查看 set user "hadoop" ##设定参数,注意",'的区别 set pwd "yangkun" set host "48.93.36.144" set timeout -1 ##;号可有可无 spawn ssh -p 2020 $user@$host expect { ##expect后有空格 "*yes/no" {send "yes\r";exp_continue} "*password:" {send "$pwd\r"} } expect "]*" ## 通配符,使用 ]* 有效, 使用 *# 无效 send "touch /home/hadoop/aa.txt\r" expect "]*" send "echo hello world >> /home/hadoop/aa.txt\r" expect "]*" [interact] ##人为交互 send "exit\r" ##退出

  

例2:配置免密登录并安装JDK #!/bin/bash #!/usr/bin/expect SERVERS="114.114.114.114" ##数组以空格分隔,可以为目标ip 或者hostName PASSWORD="yangkun" ## 实现免密登录配置的函数 auto_ssh_copy_id() { expect -c "set timeout -1; spawn ssh-copy-id \"-p 2020 $1\"; ## 这里要注意,使用'或\'不可行 expect { *(yes/no)* {send -- yes\r;exp_continue;} *password:* {send -- $2\r;exp_continue;} eof {exit 0;} }"; } ## 循环执行,配置主机到从节点所有免密 ssh_copy_id_to_all() { for SERVER in $SERVERS ## 取值需要加$ do auto_ssh_copy_id $SERVER $PASSWORD done } ## 调用循环配置函数 ssh_copy_id_to_all ## 批量部署 for SERVER in $SERVERS do scp install.sh root@$SERVER:/root ssh root@$SERVER /root/install.sh donel取文件中的host配置

读取文件中的host配置

让脚本自动读取slaves文件中的机器名来批量安装 cat slaves | while read host do echo $host expect -c "set timeout -f spawn ssh-copy-id $host" done 例3:批量配置JDK,install.sh

以root用户执行

#!/bin/bash BASE_SERVER=master BASE_PATH=/home/hadoop/soft TARGET_PATH=/usr/local JAVA_PATH=$TARGET_PATH/java ## 1.判断是否存在文件夹,不存在则创建soft文件夹 #if [ ! -d "$BASE_PATH" ]; then # mkdir "$BASE_PATH" #fi ## 2.从指定host拷贝jdk到目标机器上(已经拷贝文件夹) scp -r $BASE_SERVER:$BASE_PATH $BASE_PATH ## 2.解压jdk到指定目录 if [ ! -d "$JAVA_PATH" ]; then sudo -S mkdir -p "$JAVA_PATH" fi ## 赋予权限 sudo -S chmod -R hadoop:hadoop $JAVA_PATH tar -zxvf $BASE_PATH/jdk1.8.0_121.tar.gz -C $JAVA_PATH ## 3.配置环境变量 sudo -S cat>>/etc/profile


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3