`
tomhibolu
  • 浏览: 1383712 次
文章分类
社区版块
存档分类
最新评论

shell expect的简单用法

阅读更多

使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。
  脚本代码如下:
  ##############################################
  #!/usr/bin/expect
  set timeout 30
  spawn ssh -l username 192.168.1.1
  expect "password:"
  send "ispass/r"
  interact
  ##############################################
  1. [#!/usr/bin/expect]
  这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
  注意:这一行需要在脚本的第一行。
  2. [set timeout 30]
  基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒
  3. [spawn ssh -l username 192.168.1.1]
  spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。
  它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
  4. [expect "password:"]
  这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
  5. [send "ispass/r"]
  这里就是执行交互动作,与手工输入密码的动作等效。
  温馨提示: 命令字符串结尾别忘记加上“/r”,如果出现异常等待的状态可以核查一下。
  6. [interact]
  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行
  #!/usr/bin/expect #(注意安装的路径,不确定 whereis expect 一下 )
  # Change a login shell to bash
  set user [lindex $argv 0]
  spawn bash $user
  expect "]:"
  send "/bin/bash "
  expect eof
  exit

例子:

#!/usr/bin/expect -f
set password 123456

set date [exec date -d yesterday "+%Y-%m-%d"]
#exp_internal 1
spawn /usr/bin/scp oracle@192.168.55.232:/home/oracle/cai-website.log.$date /home/oracle/zy/backup/
set timeout 300
expect "password:"
send "$password\r"
set timeout 300
log_file /home/oracle/zy/test
expect eof

exit

假如该文件名为expect-scp.sh那么就执行

expect expect-scp.sh或者

./expect-scp.sh会得到如下结果:

spawn /usr/bin/scp oracle@192.168.55.232:/home/oracle/cai-website.log.2011-10-24 /home/oracle/zy/backup/
cai-website.log.2011-10-24 100% 1183KB 1.2MB/s 00:01
send: spawn id exp6 not open
while executing

"send "$password\r""
(file "expect.sh" line 8)

其实大家可以看出,这个结果还是有问题的,也就是说这个脚本还有那么一点点小问题,各位大仙,如果你要是发现问题了,我们可以一起讨论一下~

分享到:
评论

相关推荐

    shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了。 从网上查到使用...

    shell中嵌套执行expect命令实例

    一直都想把expect的操作写到bash脚本里,这样就不用我再写两个脚本来执行了,搞了一下午终于有点小成就,给大家看看吧. 系统:centos 5.x 1.先安装expect 代码如下: yum -y install expect 2.脚本内容: 代码如下: cat...

    shell脚本通过expect实现自动单边无密登录功能

    于是结合expect的使用方法自行写了一个,通过验证可用。现在总结在这供需要的朋友参考。 代码如下: EXPECT=/usr/bin/expect $EXPECT <<EOF spawn ssh-keygen -t rsa expect *ssh/id_rsa* { send -- \r ...

    Linux经典脚本expect的示例及基本用法

    我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的...

    Shell脚本专家指南

    《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...

    autopass:类似expect实现密码自动输入,同时比expect用法更简单

    该脚本由bash shell实现,功能类似expect,ssh到远程主机可以实现自动输入密码(密码验证模式下),用法比expect简单很多。 示例如下: $ ./autopass Usage: autopass -h host [-u user] [-p port] [-k password |...

    Linux expect 介绍和用法

    expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

    shell实现批量登录服务器修改用户密码

    虽然现在有ansible、saltstack等批量处理工具,但是在内网环境下,这些工具还需要离线安装,安装好之后还需要学会工具的使用方法,比较麻烦;甚至还有一些比较苛刻的企业,为了服务器安全,连ssh公钥都不让推送。...

    Shell中的函数、函数定义、作用域问题介绍

    然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法。 一、Shell中...

    跟老男孩学Linux运维:Shell编程实战

    前 言第1章 如何才能学好.../ 310第18章 Expect自动化交互式程序应用实践 / 317第19章 企业Shell面试题及企业运维实战案例 / 340第20章 子Shell及Shell嵌套模式知识应用 / 377附 录 Linux重要命令汇总 / 393

    linux中expect的介绍与使用示例

    expect是一种自动交互语言,能实现在shell脚本中为scp和ssh等自动输入密码自动登录。下面这篇文章主要介绍了linux中使用expect的方法示例,需要的朋友可以参考借鉴,下面来一起学习学习吧。

    expect:带有 TAP 输出的 Bash 单元测试。 您是否有要为其编写自动化测试的 shell 命令? 此工具为您提供了一个 assert 方法,您可以使用它来描述和测试您的代码

    expect - 具有有效 TAP v13 输出的 bash 脚本的简单测试方法安装克隆这个 repo 并运行make install (你可能需要 sudo )例子这是一个示例测试文件。 假设您将其命名为test/random_tests : expect " the file to ...

    用纯Rust编写Shell补全脚本-Linux开发

    用法Shell完成脚本被编写为普通的Rust二进制文件。 下面是一个最小的示例:use shell_completion :: {BashCompletionInput,CompletionInput,CompletionSet}; fn main(){让input = BashCompletionInput :: from_...

    glob:支持根据 Unix shell 样式模式匹配文件路径

    用法要使用glob ,请将其添加到Cargo.toml : [ dependencies ]glob = " 0.3.0 " 并将其添加到您的箱子根目录: extern crate glob;例子打印 /media/ 及其所有子目录中的所有 jpg 文件。 use glob :: glob;for entry...

    shellac:将您的shell脚本涂上一些更漂亮的东西

    用法import shellac from 'shellac'test ( 'morty' , async ( ) => await shellac ` $ echo "End-to-end CLI testing made nice" $ node -p "5 * 9" stdout >> ${ ( answer ) => expect ( Number ( answer ) ) ....

    一键批量配置ssh免密码登录

    本脚本采取嵌入式编写,使用expect+shell,自动检测安装expect模块 #使用方法:./script.sh filename # ip列表中第一列为IP,第二列为IP对应的用户密码。列与列之间空格隔开 一个脚本搞定全部SSH免密码登录多台服务器

    SparkDeployTools:用于将 spark 自动部署到多节点的 Linux shell

    使用方法:./mscp.sh [-conf conf_file_name] -option sourcePath destDir 例如,在本地修改一个Spark-env.sh之后,将其上传到Spark目录的conf目录,覆盖原有的配置: ./mscp.sh -conf ./user_host_passwds -file ~/...

    SigmationTF自动化测试教程

    系统的管理与Shell编程知识,并且熟练掌握ITCL与EXPECT脚本语言。 本文适合SigmationTF自动化测试工程师课程的进修或培训使用,对本文 内容涉及的实验部分需要参考相关操作系统和设备操作手册。

    pexpect_deploy_tools:批量远程操作脚本-- scp 和 ssh

    使用方法: 当前目录创建 ip list: 192.168.0.100 192.168.0.101 pscp.py 拷贝本地文件到远程机器(iplist.txt)列表的制定目录 pscp.py iplist.txt source_localfile destpath 说明: iplist.txt: 远程机器列表 ...

Global site tag (gtag.js) - Google Analytics