Shell之免交互编写

一、Here Document

概述

使用I/O重定向的方式将列表提供给交互式程序

标准输入的一种替代品

语法格式

命令 <<标记

标记

使用注意事项

  • 标记可以使用任意合法字符
  • 结尾的标记一定要顶格写,前面不能有任何字符
  • 结尾的标记后面也不能有任何字符(包括空格)
  • 开头标记前后的空格会被省略掉

1.3、免交互

通过read命令接受输入并打印

通过passwd给用户设置密码

#!/bin/bash

Passwd  jerry  <<EOF

   123456

   123456

EOF

1.4、变量设定

变量替换

#!/bin/bash

doc_file=”2019.txt”

i=company

cat  >  $doc_file  <<  HERE

Take  him  from  home  to  $i

HERE

变量设定

#!/bin/bash

ivar=”Great!  Beautiful!”

myvar=$(cat  <<EOF

This  is  Line  1

$ivar

EOF

)

格式控制

关闭变量替换功能

cat  <<’EOF’

……

EOF

去除每行之前的TAB作用

Cat  <<-‘EOF’

……

EOF

 

多行注释

:<<EOF

第一行注释

第二行注释

……

EOF

二、Expect

概述

  • 建立在tcl之上的一个工具
  • 用于进行自动化控制和测试
  • 解决shell脚本种交互相关的问题

Expect安装

yum  -y  install  expect

2.3、基本命令

expect
  • 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
  • 只能捕捉由spawn启动的进程的输出
  • 用于接收命令执行后的输出,然后和期望的字符串匹配send
  • 向进程发送字符串,用于模拟用户的输入
  • 该命令不能自动回车换行,一般用\r或\n(回车)
spawn
  • 启动进程,并跟踪后续交互信息
  • 结束符
  • expect eof
  • 等待执行结束
  • interact
  • 执行完成后保持交互状态,把控制权交给控制台
set
  • 设置超时时间,过期则继续执行后续指令
  • 单位是秒
  • timeout -1表示永不超时
  • 默认情况下timeout是10秒
  • exp_continue
  • 允许expect继续向下执行指令
  • send_user
  • 回显命令,相当于echo
接收参数
  • expect脚本可以接受从bash传递的参数
  • 可以使用[lindex $argv n]获得
  • n从0开始,分别表示第一个、第二个…参数

Expect语法

单一分支语法
expect  “password:”  {send  “mypassword\r”}
多分支语句

send命令不具备回车换行,一般要加\r或\n

expect  “aaa”  {send  “AAA\r”}

expect  “bbb”  {send  “BBB\r”}

expect  “ccc”  {send  “CCC\r”}

只要匹配了aaa或bbb或ccc中任何一个后退出该expect

expect  {

“aaa”  {send  “AAA\r”}

“bbb”  {send  “BBB\r”}

“ccc”  {send  “CCC\r”}

}

如果匹配了aaa,执行完send后继续向下执行

expect  {

“aaa”  {send  “AAA\r”;exp_continue}

“bbb”  {send  “BBB\r”;exp_continue}

“ccc”  {send  “CCC\r”}

}

expect执行方式

直接执行

#!/usr/bin/expect
expect

set  timeout  60

log_file  test.log

log_user  1

set  hostname  [lindex  $argv  0]

set  password  [lindex  $argv  1]

spawn  ssh  root@$hostname

expect  {

         “(yes/no)”

         {send  “yes\r”;exp_continue}

         “*password”

         {send  “$password\r”}

}

嵌入执行

#!/bin/bash
expect

hostname=$1

password=$2

/usr/bin/expect  <<-EOF

spawn  ssh  root@$hostname

expect  {

         “(yes/no)”

         {send  “yes\r”;exp_continue}

         “*password”

         {send  “$password\r”}

}

expect  “*]#”

send  “exit\r”

expect  eof

EOF

创建用户并设置密码(嵌入执行)

vim  passwd.sh

#!/bin/bash

创建用户并设置密码

user=$1

password=$2

useradd  $user

expect  <<EOF

spawn  passwd  $user

expect  “新的密码:”

send  “$password\r”

expect  “确认”

send  “$password\r”

expect  eof

EOF

:wq(保存并退出)

chmod  +x  passwd.sh     (给passwd.sh添加执行权限)

./passwd.sh  liming  123456  (执行脚本,后面跟的是位置变量$1和$2)

实现ssh自动登录(直接执行)

vim  ssh.sh

#!/usr/bin/expect

ssh自动登录

set  timeout  5

set  hostname  [lindex  $argv  0]

set  password  [lindex  $argv  1]

spawn  ssh  $hostname

expect  {

         “Connection  refused”  exit

         “Name  or  service  not  known”  exit

         “to  continue”  {send  “yes\r”;exp_continue}

         “password:”  {send  “$password\r”}

}

interact

exit

:wq(保存并退出)

chmod  +x  ssh.sh     (给passwd.sh添加执行权限)

./ssh.sh  20.0.0.10  123456  (执行脚本,后面跟的是位置变量0和1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值