shell扩展——免交互脚本

    科技2025-01-07  13

    一、Here Document 免交互

    使用工/o重定向的方式将命令列表提供给交互式程序,标准输入的一种替代品

    语法格式:

    命令<<标记 …… #标记之间是传入内容 …… 标记

    注意事项:

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

    示例

    1.免交互方式实现对行数的统计,将要统计的内容置于标记"EOF"之间,直接将内容传给wc -l来统计

    [root@localhost ~]# wc -l <<eof > line 1 > line2 > line3 > line4 > eof 4 //输出结果4行

    2.通过passwd给用户设置密码

    [root@localhost ~]# useradd lisi [root@localhost ~]# passwd lisi <<eof > abc123 > abc123 > eof

    3.整体赋值给变量

    #/bin/bash I="i'm smart" m=$(cat <<eof I am cool $I //在内部调用变量I eof ) echo $m [root@localhost ~]# ./test.sh I am cool i'm smart

    4.支持变量的替换

    [root@localhost ~]# vi test.sh #/bin/bash I="i'm smart" F=test.txt cat > $F <<eof //相当于将cat查看到的内容重定向到test.txt中 I am cool and $I eof [root@localhost ~]# ./test.sh [root@localhost ~]# cat test.txt I am cool and i'm smart

    5.关闭变量替换的功能,对标记加单引号,即可关闭变量替换

    [root@localhost ~]# vi test.sh #/bin/bash I="i'm smart" F=test.txt cat > $F <<eof //相当于将cat查看到的内容重定向到test.txt中 I am cool and $I eof [root@localhost ~]# ./test.sh [root@localhost ~]# cat test.txt //变量不能在被调用 I am cool and $I

    6.多行注释,":”开头的Here Document标记内容不会被执行

    -----------------------使用:eof注释前效果----------------------------------------- #/bin/bash M=$(cat <<eof I am cool eof cat <<eof I'm smart eof ) echo $M [root@localhost ~]# ./test.sh I am cool I'm smart -----------------------使用:eof注释后效果----------------------------------------- #/bin/bash M=$(cat <<eof I am cool eof cat :<<eof I'm smart eof ) echo $M [root@localhost ~]# ./test.sh cat: :: 没有那个文件或目录 I am cool

    二、Expect 免交互

    Expect是建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题 因此我们需要查看是否已经安装tcl语言环境及expect程序

    [root@localhost ~]# rpm -q expect 未安装软件包 expect [root@localhost ~]# rpm -q tcl 未安装软件包 tcl [root@localhost yum.repos.d]# yum -y install expect [root@localhost yum.repos.d]# yum -y install tcl

    基本命令:

    (1)脚本解释器 expect脚本中首先引入文件,表明使用的是哪一个shell。 .!/usr/bin/expect (2) spawn spawn后面通常跟一个命令,表示开启一个会话、启动进程,并跟踪后续交互信息。 例:spawn passwd root ( 3) expect 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由tspawm启动的进程的输出,用于接收命令执行后的输出,然后和期望的字符串匹配 ( 4) send 向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r(回车),有三种方式 例:

    casel="密码" respond="abc1234"" -----------------------------------方式1----------------------------------------------------- expect "$casei"{ send "srespond1\r"} -----------------------------------方式2----------------------------------------------------- expect "$casel" send "$response1\r" -----------------------------------方式3------------------------------------------------------ expect { "$case1" { send "$response1\r"} "$case2" { send "$response2\r"} "$case3" { send "$response3\r"} }

    (5)结束符

    expect eof 等待执行结束,退回到原用户,spawn对应 expect脚本默认的是等待10s,当执行完ls命令后,默认停留10s后,自动切回了原用户interact 执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。使用interact会保持在终端而不会退回到原终端,比如切换到rot用户,会一直在root用户状态下,比如ish到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。注意:expect eof 与interact只能二选一。

    (6) set expect默认的超时时间是10秒,通过set命令可以设置会话超时时间,若不限制超时时间则应设置为-1。 例:set timeout 30 (7) exp _continue exp_continue表示允许expect继续向下执行指令。 例:

    expect { "请输入密码”{ send "abc123";exp_continue} "再次输入密码”{send "abc123";exp_continue } "清再再次输入密码”{send "abc123"} )

    8 send user send user―麦示回显命令,相当于echo 9.接收参数 expect脚本可以接受从bash命令行传递的参数,使用[lindex Sargy n]获得。其中n从o开始,分别表示第一个,第二个;第三个.参数。 例:

    set hostname [lindex $argv 0] -------------------- 相当于hostname=$1 set password[ lindex $argv 1] ------------------------- 相当于password=$2

    示例

    免交互登入数据库

    #/usr/bin/expect spawn mysql -uroot -p expect { "password" {send "abc123\r"; exp_continue} }
    Processed: 0.010, SQL: 8