[转帖]Linux中EOF和Expect命令详解

linux,eof,expect,命令,详解 · 浏览次数 : 0

小编点评

**Expect 语句** Expect 是一个基于 tcl 演变的自动化工具,用于模拟用户输入并执行远程命令。它支持多种语法,包括: * **send** 命令用于向进程发送字符串。 * **expect** 命令用于检查上次输出结果是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回。 * **spawn** 命令用于启动进程并跟踪后续交互信息。 * **interact** 命令用于执行命令并等待其结束。 * **expect eof** 命令用于等待结束标志。 **语法** 以下是一些常见 Expect 语句的示例: * **send "hello world"** 向进程发送字符串 "hello world"。 * **expect "password:"** 检查上次输出结果是否包含 "password" 字符串。 * **spawn "firefox"** 启动firefox浏览器。 * **interact "Enter your name:"** 向进程发送字符串 "Enter your name:" 并等待其输入。 * **expect eof** 等待结束标志。 **示例** 以下是一个使用 Expect 语句模拟用户登录 SSH 服务器的示例: ```bash # a.sh expect & spawn ssh root@server_ip "/bin/bash" expect "Enter username:" send "username" expect "Enter password:" send "password" expect "Password: " expect eof interact expect "Enter your name:" send "Your name here" expect "Enter your age:" send "25" expect "Login successful!" expect "Exiting now." ``` **使用 Expect** 1. 安装 Expect 工具。 2. 创建一个 Expect script 文件。 3. 在 script 文件中使用 `spawn` 和 `interact` 等命令来执行远程命令。 4. 使用 `expect eof` 等命令等待结束标志。 5. 使用 `chmod` 等命令设置执行权限。 6. 运行 script 文件。

正文

一、EOF说明

Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。

 回顾一下< <的用法。当shell看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。

cat和eof结合使用具有追加功能

使用Cat和EOF多行输入

cat >> /root/test.txt <<EOF 
java 
hello word ! 
hadoop
EOF

上的脚本命令是,在test.txt文件后面加上三行代码。

二、Expect概述

  • expect 是基于tcl 演变而来的,所以很多语法和tcl 类似,Expect 是用来进行自动化控制和测试的工具。主要解决shelI脚本中不可交互的问题。对于大规模的linux运维很有帮助
  • 在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no,password等信息。为了模拟这种输入,可以使用Expect脚本

Expect安装

  • yum -y install tcl-devel
  • yum -y install expect

三、基本命令

send:向进程发送字符串,用于模拟用户的输入, 该命令不能自动回车换行,一般要加\r(回车)

expect: expect的一个内部命令,判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉由spawn启动的进程的输出expect

spawn:启动进程,并跟踪后续交互信息

interact:执行完成后保存交互状态,把控制权交给控制台

● 单位是:秒
● timeout -1 为永不超时
● 默认情况下,timeout是10秒

set timeout 30:设置超时时间为30秒(默认的超时时间是 10 秒,通过 set 命令可以设置会话超时时间, 若不限制超时时间则应设置为-1)
exp_continue: 允许expect继续向下执行指令meout:指定超时时间,过期则继续执行后续指令

send_user: 回显命令,相当于echo

$argv参数数组Expect脚本可以接受从bash传递的参数,可以使用 [lindex $argv n] 获得,n从0开始,分别表示第一个$1,第二个$2,第三个$3……参数 ($argvn没有空格则表示脚本名称 ; $argv n有空格则代表下标)

一般流程:spawn 启动追踪 —> expect 匹配捕捉关键字 ——> 捕捉到将触发send 代替人为输入指令—> interact /expect eof

Expect脚本必须以interact或expect eof 结束,执行自动化任务通常expect eof就够了

● expect eof 是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof 即在等待这个标记

四、Expect语法

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

单一分支语法:

expect “password:” {send “mypassword\r”;}

多分支模式语法:

方式一:

expect “aaa” {send “AAA\r”}
expect “bbb” {send “BBB\r”}
expect “ccc” {send “CCC\r”}

方式二:只要匹配了aaa或bbb或ccc中的任何一个,执行了了相应的send语句后将会退出该expect语句

expect {
“aaa” {send “AAA\r“}
“bbb” {send “BBB\r”}
“ccc” {send “CCC\r”}
}

方法三:exp_continue表示继续后面的匹配,如果匹配了aaa,执行完send语句后还要继续向下匹配bbb

exoect {
“aaa” {send “AAA\r“;exp_continue}
“bbb” {send “BBB\r”;exp_continue}
“ccc” {send “CCC\r”}
}

五、Expect执行方式

案例:ssh远程免交互登录

直接执行:

[root@localhost ~]#vi login.sh
#!/usr/bin/expect                           //expect文件路径
set timeout 60
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"}
}
interact
[root@localhost ~]#chmod +x a.sh
[root@localhost ~]#./login.sh 192.168.100.101 123abc

嵌入执行:

[root@localhost ~]#vi login.sh
#!/bin/bash
hostname=$1
password=$2
set timeout 60
/usr/bin/expect<<-EOF                           //加载expect文件路径
spawn ssh root@${hostname}
expect {
"(yes/no)" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
expect "*]#"             //匹配进入后的页面
send "exit\r"            //触发退出
expect eof               //等待结束
EOF                          //expect结束标志,EOF前后不能有空格
[root@localhost ~]#chmod +x a.sh
[root@localhost ~]#./login.sh 192.168.100.101 123abc

案例一:创建用户tom,密码tom123**

  1. [root@localhost ~]#vim b.sh
  2. #!/bin/bash
  3. user=$1
  4. password=$2
  5. useradd $user
  6. expect<<-EOF //加载expect文件路径
  7. spawn passwd $user //开启进程跟踪passwd
  8. expect {
  9. "New password:" {send "$password\r";exp_continue} //匹配关键字并自动输入密码
  10. "*password" {send "$password\r"} //匹配关键字并自动输入密码
  11. }
  12. expect eof //等待结束
  13. EOF
  14. [root@localhost ~]#chmod +x b.sh
  15. [root@localhost ~]#./b.sh tom tom123

案例二:SSH登录

● 首次登录
● 正常登录
● 连接被拒绝,可能是ssh没开,或者端口不对,或者防火墙限制
● 没有连接地址

  1. [root@localhost ~]#vim c.sh
  2. #!/usr/bin/expect //expect文件路径
  3. set timeout 20
  4. set hostname [lindex $argv 0]
  5. set password [lindex $argv 1]
  6. spawn ssh root@$hostname
  7. expect {
  8. "Connection refused" exit
  9. "Name or service not know" exit
  10. "(yes/no)" {send "yes\r";exp_continue}
  11. "*password:" {send "$password\r"}
  12. }
  13. interact
  14. exit
  15. [root@localhost ~]#chmod +x a.sh
  16. [root@localhost ~]#./c.sh 192.168.100.100 123abc

案例三:FTP登录

  1. [root@localhost ~]#vim d.sh
  2. #!/bin/bash
  3. hostname=$1
  4. expect<<-EOF
  5. spawn ftp $hostname
  6. expect {
  7. "Name" {send "ftp\r";exp_continue}
  8. "Password" {send "\r"}
  9. }
  10. expect eof
  11. EOF
  12. [root@localhost ~]#chmod +x d.sh
  13. [root@localhost ~]#./d.sh 192.168.100.100 //本机要开启ftp,对方也要开启
文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux进阶新增用户23083 人正在系统学习中

与[转帖]Linux中EOF和Expect命令详解相似的内容:

[转帖]Linux中EOF和Expect命令详解

一、EOF说明 Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。 回顾一下< <的用法。当shell看到< <的时候,它就会知道下一个词是一个分界符。在

[转帖]Linux中常见IO调度器

https://www.jianshu.com/p/3c16e39a005a 单队列调度算法多队列调度算法 deadline mqdeadlines cfq bfq noop none kyber 对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是

[转帖]Linux中的grep -v、-e、-E用法小结

https://www.jb51.net/article/266590.htm grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,这篇文章主要介绍了Linux之grep -v、-e、-E用法总结,需要的朋友可以参考下 + 目录 简介 grep (global sea

[转帖]Linux中的Grep命令(在文件中查找文本)

[日期:2020-05-14] 来源:Linux公社 作者:醉落红尘 [字体:大 中 小] grep命令是(global regular expression print,全局正则表达式输出)的缩写,它是Linux中功能最强大且最常用的命令之一。 grep在一个或多个输入文件中搜索与给定模式匹配的行

[转帖]Linux中的目录结构是什么样的?有人说像“树”,你觉得呢

https://bbs.huaweicloud.com/blogs/380543 【摘要】 在 Linux/Unix 操作系统中,一切都是文件,即使目录是文件,普通文件也是文件,鼠标、键盘、打印机等设备也是文件,本文笔者将带大家了解一下Linux中的文件目录结构。 文件类型Linux 中有三大类文件

[转帖]linux中关于带宽 MTU的一些命令

linux中关于带宽 MTU的一些命令 https://blog.51cto.com/xiaoliuer/1882208 查看协商的带宽大小 sudo ethtools eth0 Linux更改网卡MTU方法: 1. 打开终端,查看当前网卡设置:ifconfig 2. 对需要改MTU的网卡进行设置(

[转帖]Linux 中用 dd 命令来测试硬盘读写速度

https://www.cnblogs.com/xiexun/p/13935443.html hdparm -T /dev/sdb iostat 磁盘性能监控 由sysstat包提供 dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转

[转帖]Linux中iptraf命令详解

https://www.sohu.com/a/217620611_610671 iptraf是一个基于ncurses开发的IP局域网监控工具,它可以实时地监视网卡流量,可以生成各种网络统计数据,包括TCP信息、UDP统计、ICMP和OSPF信息、以太网负载信息、节点统计、IP校验和错误和其它一些信息

[转帖]Linux中执行shell脚本的4种方法总结

https://www.jb51.net/article/53924.htm 这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下 bash shell 脚本的方法有多种,现在作个小结。假设我们编写好的shell脚本的文件

[转帖]linux中内核的一个不错的参数somaxconn

最近发现很多内核优化参数都记不住了,写下文章来备记,方便以后查看. 编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释) #设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数) net.ipv4.ip_conntrack_max = 25000000 #最大