iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么使用expect命令实现Shell自动化交互
  • 332
分享到

怎么使用expect命令实现Shell自动化交互

2023-06-09 14:06:25 332人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关怎么使用expect命令实现shell自动化交互,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景linux脚本中有很多场景是进行远程操作的,例如远程登录ssh、远程复制scp

这篇文章将为大家详细讲解有关怎么使用expect命令实现shell自动化交互,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

背景

linux脚本中有很多场景是进行远程操作的,例如远程登录ssh、远程复制scp、文件传输sftp等。这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的。为了实现自动化远程操作,我们可以借用expect的功能。

expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。

expect的安装

expect是在Tcl基础上创建起来的,所以在安装expect前我们应该先安装Tcl。

(一)Tcl 安装

主页: Http://www.tcl.tk

下载地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml

下载源码

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz

解压缩源码包

tar xfvz tcl8.4.11-src.tar.gz

安装配置

cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install

注意:

安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。

暂时不要删除tcl源代码,因为expect的安装过程还需要用。

(二)expect 安装 (需Tcl的库)

主页: http://expect.nist.Gov/

下载源码包

wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download

解压缩源码包

tar xzvf expect5.45.tar.gz

安装配置

cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect

expect

expect的核心是spawn、expect、send、set。

spawn 调用要执行的命令

  • expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:

  • send 发送需要交互的值,替代了用户手动输入内容

  • set 设置变量值

  • interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

  • expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

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

其他设置

  • 设置expect永不超时 set timeout -1

  • 设置expect 300秒超时,如果超过300没有expect内容出现,则退出 set timeout 300

expect编写语法

expect使用的是tcl语法

  • 一条Tcl命令由空格分割的单词组成. 其中, 第一个单词是命令名称, 其余的是命令参数
     cmd arg arg arg

  • $符号代表变量的值. 在本例中, 变量名称是foo.
     $foo

  • 方括号执行了一个嵌套命令. 例如, 如果你想传递一个命令的结果作为另外一个命令的参数, 那么你使用这个符号
     [cmd arg]

  • 双引号把词组标记为命令的一个参数. "$"符号和方括号在双引号内仍被解释
     "some stuff"

  • 大括号也把词组标记为命令的一个参数. 但是, 其他符号在大括号内不被解释
     {some stuff}

  • 反斜线符号是用来引用特殊符号. 例如:n 代表换行. 反斜线符号也被用来关闭"$"符号, 引号,方括号和大括号的特殊含义

示例

login.exp专用于远程登录,快捷使用方式: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"

#!/usr/bin/expect -f########################################################### 通过SSH登陆和执行命令#参数:1.Use_Type [check/execute]#  2.SSHServerIp#  3.SSHUser#  4.SSHPassWord#  5.CommandList [多个命令间以;间隔]#返回值:#  0 成功#  1 参数个数不正确#  2 SSH 服务器服务没有打开#  3 SSH 用户密码不正确#  4 连接SSH服务器超时##########################################################proc usage {} { regsub ".*/" $::argv0 "" name send_user "Usage:\n" send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n" exit 1} ## 判断参数个数if {[llength $argv] != 5} { usage}#设置变量值set Use_Type [lindex $argv 0]set SSHServerIp [lindex $argv 1]set SSHUser [lindex $argv 2]set SSHPassword [lindex $argv 3]set CommandList [lindex $argv 4]#spawn ping ${SSHServerIp} -w 5#expect {# -nocase -re "100% packet loss" {#  send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address.\n"#  exit 1# }#}set timeout 360set resssh 0#定义变量标记ssh连接时是否输入yes确认set inputYes 0set ok_string LOGIN_SUCCESSif {$Use_Type=="check"} { #激活ssh连接,如果要需要输入yes确认,输入yes,设置inputYes为1,否则输入ssh密码 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string"} else {    spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList"}expect { -nocase -re "yes/no" {  send -- "yes\n"  set inputYes 1 } -nocase -re "assword: " {  send -- "${SSHPassword}\n"  set resssh 1 } #-nocase -re "Last login: " {  #  send -- "${CommandList}\n" #} $ok_string {} -nocase -re "Connection refused" {  send_error "SSH services at ${SSHServerIp} is not active.\n"  exit 2 } timeout {  send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).\n"  exit 4 }}#如果输入了yes确认,输入ssh密码if {$inputYes==1} { expect {  -nocase -re "assword: " {   send -- "${SSHPassword}\n"   set resssh 1  } }}#如果出现try again或者password:提示,说明输入的用户密码错误,直接退出。if {$resssh==1} { expect {  -nocase -re "try again" {   send_error "SSH user:${SSHUser} passwd error.\n"   exit 3  }  -nocase -re "assword:" {   send_error "SSH user:${SSHUser} passwd error.\n"   exit 3  }  eof {} }}send_error -- "$expect_out(buffer)"#-nocase -re "No such user" {#  send_error "No such user.\n"#  exit 5# }#exit

关于“怎么使用expect命令实现Shell自动化交互”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么使用expect命令实现Shell自动化交互

本文链接: https://www.lsjlt.com/news/256450.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在 Golang 中替换正则表达式匹配的文本?
    在 go 中,可使用 regexp.replaceall 函数替换符合正则表达式的文本,该函数需要三个参数:待替换字符串、匹配模式和替换文本。例如,将字符串中 "fox" 替换为 "do...
    99+
    2024-05-14
    golang 正则表达式
  • 如何在 Golang 中测试随机数生成器的准确性?
    在 go 中测试随机数生成器准确性的步骤包括:生成大量随机数并计算每个范围内的出现次数,以确保均匀分布。针对指定均值和标准差计算每个范围内的出现次数,以确保正态分布。 如何在 Gola...
    99+
    2024-05-14
    golang 随机数
  • 面向对象设计原则在C++中的体现
    c++++ 体现了 oop 原则,包括:封装:使用类将数据和方法封装在对象中。继承:允许派生类从基类继承数据和行为。多态:允许对象的行为根据其类型而改变,通过虚函数实现。 面向对象设计...
    99+
    2024-05-14
    c++ 面向对象
  • c语言怎么区分小数和整数
    c 语言区分小数和整数的方法有:数据类型不同:小数类型(float、double)包含小数点,整数类型(int)不包含。printf() 函数中使用不同格式化字符串:小数用 %f,整数用...
    99+
    2024-05-14
    c语言
  • 设计模式在C++ 中的可复用性和可扩展性
    在 c++++ 中,设计模式通过提供经过验证的解决方案来提高可复用性和可扩展性。可复用性允许重复使用代码,例如 factory method 模式,它支持创建不同的产品而不影响具体类。可...
    99+
    2024-05-14
    c++ 设计模式 高可扩展性
  • C++语法中函数模板的灵活运用
    C++ 语法中函数模板的灵活运用 函数模板是 C++ 中的一项强大功能,允许您创建可用于不同数据类型的一组代码。这可以提高代码的可重用性,并使您能够编写更通用、更可维护的代码。 语法 ...
    99+
    2024-05-14
    c++语法 函数模板 c++
  • c语言怎么计算字符串长度和宽度
    在 c 语言中,计算字符串长度和宽度的函数分别为:strlen() 函数用于计算字符串长度,不包括终止符 '\0'。strwidth() 函数用于计算字符串在终端中的宽度,返回显示像素数...
    99+
    2024-05-14
    c语言
  • 如何用 Golang 正则匹配多个单词或字符串?
    golang 正则表达式使用管道符 | 来匹配多个单词或字符串,将各个选项作为逻辑 or 表达式分隔开来。例如:匹配 "fox" 或 "dog":fox|dog匹配 "quick"、"b...
    99+
    2024-05-14
    golang 正则 python
  • c语言怎么跳出多层循环
    在 c 语言中,可以使用嵌套的 break 语句跳出多层循环。对于每个要跳出的循环层,都需要一个单独的 break 语句。例如:使用一个 break 语句跳出内层循环再使用一个 brea...
    99+
    2024-05-14
    c语言
  • c语言怎么注释成中文
    c语言中文注释提供两种方式:行内注释(以"//"开头)和块注释(以"/"开头并以"/"结尾)。最佳实践包括:使用简明扼要的语言,在函数和类开头处添加块注释,在关键部分添加行内注释,保持注...
    99+
    2024-05-14
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作