shell嵌套expect中puts报错

在shell脚本中嵌套了expect
然后定义一个变量,打印出来就报错。
具体如下:
代码:图片说明
结果:图片说明

0

1个回答

示例的脚本里,实际上bash在调用时,会把$j和$i都展开了,所以实际上puts $j会被展开成puts 1,puts $i会被展开成puts ($i是空的)。
并不是表面上看到的$j变量传入给了expect。

而对于bash来说,如果要在Bash的Here-Documents里不展开变量,可以采用类似如下方法:
#!/bin/bash

/usr/bin/expect <<\EOF
set i 1
puts "i is $i"
EOF

可以注意到这段代码把puts $j去掉了(因为加入的话,j在expect里是未定义的,因此会报错)。

可以参考:
[1] What's the difference between <<EOF and <<\EOF heredocs in shell: https://stackoverflow.com/questions/31679384/whats-the-difference-between-eof-and-eof-heredocs-in-shell
[2] bash EOF的几种用法: http://blog.csdn.net/eyf0917/article/details/38399335
[3] Bash Reference Manual, 3.6.6 Here Documents: https://www.gnu.org/software/bash/manual/bash.html#Here-Documents

0
mamamiyear
mamamiyear 3Q
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
shell嵌套expect执行命令
    一直都想把expect的操作写到bash脚本里,这样就不用我再写两个脚本来执行了,搞了一下午终于有点小成就,给大家看看吧.   系统:centos 5.x   1.先安装expect yum -y install expect   2.脚本内容: cat auto_svn.sh   #!/bin/bash passwd='123456' /usr/bin/e...
shell中嵌套使用expect 实例
#!/bin/sh username=hailonxi echo $# i=1 ###参数都放在数组a中 for args in $@ do     a[i]=$args     i=($i+1) done ###参数的数量number number=${#a[@]} ###获取要传的文件 filename=${a[1]} ###分别处理各个参数
shell中嵌套expect实现ssh登录
我想在某台测试服务器上集中监控一些服务器的磁盘空间。但是又不想配置主机信任关系,怕不安全,公司不允许。因此想通过shell脚本中嵌套expect方式来实现。 一:安装expect expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具! expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装。   下载
shell中的expect语句
expect expect 是自动应答命令,用于交互式命令的自动执行。 借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率 。 参数含义及说明 spawn 是 expect 中的监控程序,其运行后会监控命令提出的交互问题 send,发送问题答案给交互命令 ...
shell嵌套expect执行screen命令
start.sh #!/usr/bin/env bash screen_name1=$"online" screen -dmS $screen_name1 cmd1=$"php pushOnlineNum.php"; screen -x -S $screen_name1 -p 0 -X stuff "$cmd1" #创建screen screen -x -S $screen_name1 -p 0
shell expect
Traditionally, background automation of interactive processes meant giving up security and reliability. With the advent of software such as Expect for controlling interactive processes, it has become possible to improve reliability and security with relative ease. This paper reviews the reliability aspects but focuses primarily on the security aspects, presenting several non-obvious techniques for dealing with passwords and other sensitive information in background processes. These techniques require no changes to existing programs and no new security systems are necessary. With the appropriate tools and examples,
shell中expect的初步使用
想用rsync同步两个服务器的日志,但是又不想弄密钥做验证 于是想到直接用shell自动输入账号密码来连接另一台服务器 脚本第一行#!/usr/bin/expect 表示使用expect进行处理 脚本本身需要赋予执行权限才可以执行expect chmod 777 expectTest.sh 然后才能通过./expectTest.sh执行 通过  expect "需要检测的控制台
bash 嵌套expect
有一个简单的shell脚本rnbash1:rnrn#!/usr/bin/expectrnset user [lindex $argv 0]rnsend_user "user\n"rnrnchmod +x bash1rn./bash1 "johnbl"rnrn会得到回显johnbl。rnrnbash2:rnrn#!/bin/bashrnrnecho $0rn/usr/bin/expect <<-EOFrnset user [lindex $argv 0]rnsend_user "user\n"rnEOFrnecho $0rnrnrnchmod +x bash2rn./bash1 "johnbl"rnrn却得不到回显johnbl。rnrn请大神不吝赐教rnrnrn
expect shell 发送组合键
在linux下面的组合键实际就是ASCII ,想要模拟某个组合键,在程序中发送这个组合键的ASCII即可,比如:CTRL-A的ASCII是 01; 下面是一段自动打开minicom程序,并设置输入回显。#!/usr/bin/expect spawn minicom expect "Press CTRL-A Z for help" send "\01" send "z" send "e" int
shell 之 expect 简单使用案例
1.在本地执行命令操作远程服务器 #!/bin/bash /usr/bin/expect &amp;lt;&amp;lt;EOF set timeout 10 spawn ssh python@192.168.1.103 expect {      &quot;*yes/no&quot; { send &quot;yes\r&quot;; exp_continue}     &quot;password:&quot; {send &quot;xxxxx\r&quot;} } ...
expect 实现与shell交互
更改libvirt密码 实现与shell交互  网上看了些expect的用法都不行,下面这种用法一般交互都没问题 spawn saslpasswd2 -a libvirt test expect {        "Password*" {                 send "xxx\n";                 exp_continue          }  
关于expect shell 与rsh
[code=text]#!/bin/bashrnip=1rnrnwhile [ $ip -lt 255 ]rndorn echo "#####################################---$ip">>statusinfornrn echo "------------------username:">>statusinforn echo "hadoop">>statusinforn echo "------------------ip:">>statusinforn echo "192.168.150.$ip">>statusinforn echo "------------------hostname:">>statusinfornrn expect -c " rn set timeout 25rn expect *rn spawn rsh 192.168.150.$ip -l hadoop hostname>>statusinforn expect "password"rn send "hadoop\r"rn "rn sleep 2rn ip=`expr $ip + 1`rnrndone[/code]rnrn我的目的是通过一次循环,获取150段内所有机器的主机名和对应的ip地址,通过rsh远程机器,然后hostname命令结果重定向到本机的statusinfo文件中,可是每当shell运行到输入密码后,然后直接进入下一次循环,根本没有执行hostname命令,这是为什么 啊?大神?[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/10.gif][/img]rn都一天了,还是个这样子!
shell分发系统-expect
expect脚本远程登入: vim /expect.sh
expect和shell的交互
今天写了个脚本expect脚本 本以为很简单一件事 最后因为expect和shell的一些差别导致浪费了不少时间 特此记录下:两者交互时(expect中使用shell命令)注意[shell脚本太常用了,省略 了shell书写格式]:两者的变量赋值方式不同 expect中是:set variableName [lindex $argv 0 ] 将传入给expect脚本的参数列表的第一个参数值赋值给v...
shell中单引号的嵌套
双引号能解析变量的引用,而单引号不能解析变量的引用 。那么这里我们来说一下双引号的嵌套,双引号的嵌套能达到解析变量的效果 #! bash/sh name="zhangdan" echo 'my name is '$name'' echo "my name is $name"
shell嵌套expect脚本实现远程打包及本地安装
实际项目中,在对自己的代码进行测试时,需要首先去打包机器进行打包,然后拷贝安装包并本地重装,过程繁琐。闲暇时间写脚本实现打包简装。快哉~
安装expect报错
rn在执行./configure --with-tcl=/home/oracle/tcl8.5.13/unix/ --with-tclinclude=home/oracle/tcl8.5.13/generic/时rn出现checking for Tcl configuration... configure: error: /home/oracle/tcl8.5.13/unix directory doesn't contain tclConfig.shrnrn但是该目录下确实存在这个文件...想知道是因为什么...
expect 嵌入shell的for循环中的方式对比
大家都知道expect是可以执行交互式命令的,例如:SSH等,当你有多台设备需要登录时,我们能不能使用类似java中的for循环来完成呢?下面我们来进行对比这两种方式: 1. #!/bin/sh      test()   {           expect -c "           l
利用expect在linux shell 中的交互
#!bin/sh expect<<EOF set timeout 200 spawn scp res.zip root@192.168.160.12:/soft expect "password:" send "123456\r" expect eof EOF ps: send密码后面的’\r’必须要有
shell脚本嵌套执行expect命令
为避免反复调用,可以嵌套执行 相关命令: spawn:启动一个程序或进程 send:给进程或程序返回结果 expect:接受程序或进程输出 interact:使用户处于进程或程序的交互状态,ssh登录后不自动登出 #!/bin/bash sql_bck=/home/sql_bck if [ ! -d $sql_bck ] then mkdir -p $sql_bck fi
Linux学习笔记----shell中的expect自动应答语句
expect expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。 在实际操作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。这就是exp...
shell中使用expect进行远程执行命令
expect是用来实现自动交互功能的工具之一,使用expect-send来实现交互过程。 注意:     1、脚本的执行方法与bash shell不一样,比如:expect example.sh     2、向一个脚本传递参数时,bash shell是使用$1,$2...来接收参数的;而expect则将脚本的执行参数保存在数组$argv中,在脚本中一般将其赋值给变量:set 变量名 [lin...
shell的if嵌套
shell脚本编写中,if是可以嵌套的, 注意,if条件表达式[]中的空格,以及后面的then就行了 if条件表达式后面的分号“;”可有可无,不影响。代码如下myFile='ctr_result.txt' if [ -e "$myFile" ]; then rm $myFile result_code=$? if [ "$result_code"
shell下使用expect遍历服务器
ips=( ip1... ip2... ip3... ... ) for ip in ${ips[*]} do /usr/bin/expect set timeout 90 spawn ssh user@$ip expect "passphrase" send "password\r" expect "user" send "cd /dir\r" expect "di
shell学习之四---expect命令
expect可以实现shell实现不了的用户交互的需求。expect可以将交互写在一个脚本上,完成很多自动化的动作,比如ssh、ftp登陆等,都是需要交互需求的。expect是需要安装的,直接yum  -y install expect安装即可。 expect的四个关键命令为:spawn、expect、send、set,其中spawn是调用要执行的命令,expect是等待命令提示信息的出现也
ssh自动登录的shell,用expect
ssh连接远程服务器,涉及到输入密码过程,因此就需要交互,要用到expect. 1.MAC机器上安装expect,是用homebrew安装。           brew  install  expect 2.明确expect命令的路径      which expect  ( /usr/local/bin/expect) 3.这个expect搞定了,就可以写脚本,脚本由expect解释执行 #!...
shell expect settimeout超时问题
expect脚本中设置超时,比如下面的脚本rnrnrn文件expect_ssh_scp.shrn#!/usr/bin/expect #表示使用expect解释器rnset timeout 10 #设置超时限制为10秒rnspawn ssh userName@hremote_host command #通过ssh连接远程主机执行命令rnexpect #第一个expect语句rn "(yes/no)" send "yes\r";exp_continuern "*assword:" send "password\r"rnrnrnexpect eof #指明命令交互结束rnspawn scp source userName@hostName:dest #通过scp复制远程电脑的文件到本地rnexpect #第二个expect语句rn"(yes/no)" send "yes\r";exp_continuern"*assword:" send "password\r"rnrnrnrnexpect 100%rnexpect eofrnexitrnrnrn我想知道这个超时10秒,是对所有的expect语句有效,还是只针对第一个啊?rnrn如果超时限制对下面所有的expect语句都有效,比如下面的scp远程复制命令,如果数据没传输完,程序就超时了,那怎么解决呢?rnrn那样的话expect 100%这句代码又有什么作用??rnrn我看到一种解释是:代码刚开始设定了timeout的时间为10秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止。这样理解对吗?rnrn干嘛要这个超时限制啊,感觉很影响程序的效率,在执行过程中遇见问题就返回问题信息,退出不就好了么,就算多给10秒,还不是没法解决。就好比Java中的异常处理机制,遇见异常就,throw catch处理嘛,然后程序继续执行,这样多好,rnrn如果某一个方法非常耗时,那么就等它执行完呗,就算有一天,出现无限循环这种永远的执行不完的方法,设定一个超时,这样的逻辑感觉不对吧,出现无穷循环的问题明显是设计的问题rn
shell expect自动输入值
#!/usr/bin/expect #设置参数如你./***.sh 【下面接受的参数】--&gt;$argv set cmd [lindex $argv 0] #运行命令 spawn mkfs.ext3 $cmd #运行上面的命令时,当出现以(y,n)结尾时,自动输入y expect { &quot;*(y,n)*&quot; { send &quot;y\r&quot; } } interact...
expect的简单使用,linux交互性shell
expect的学习使用触发自一个项目,项目平台是树莓派三代,要求是要在root用户下面执行一个名为61850Svr的程序。 目前的状态是树莓派开机启动后会自动进入普通用户,于是需要自动切换到root下执行61850Svr程序,好开始: 1:首先需要你的运行环境中已经安装好了expect,怎么安装不说了。 2:对expect的理念认知: ①:expect是单独的一种脚本语言工具。ex
Shell脚本交互 expect 和send指令
1 概述 expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。 2 expect的安装 sudo apt-get install expect apt-cache search tcl apt install tcl8.6-dev 3 例子 #!/usr/bin/e...
shell 变量的嵌套使用
问题: 比如说,prefix_Trunk=“FDD_BASELINE,RCP”;echo $prefix_Trunk肯定可以得值FDD_BASELINE,RCP,但如果prefix_Trunk不能直接得到,而是处理后自己组合的一段。比如说abc=prefix_$branch,因为branch可能未知,假如branch=Trunk,那么echo $abc得prefix_Trunk,那如何得到FDD...
perl里面嵌套shell
请教一下 谁能够写一个在perl里面嵌套shell程序的例子么 ?rnrn比如shell 执行 ls -lr 命令 然后把结果返回给perl程序rn
shell 脚本之变量嵌套
title3='查找固件中的⼝令⽂件' i=3 title=title${i} eval temp=$(echo \$$title) echo $temp
shell嵌套循环的问题
有两个数组:rnrn#!/bin/bashrnUSERS1=(aaa bbb ccc eee);rnUSERS2=(aaa bbb ddd ddd);rnrn我要输出USER1、USER2下标相对应的内容:rnaaa,aaarnbbb,bbbrnccc,dddrneee,dddrnrn这样该怎么写?rnrn还有rnrnfor i in "$USERS1[@]"; dornrndone;rnrn这里的@是什么意思?如果我在这里再写一个for,in USERS2,应该是什么样的?
shell expect免密码scp拷贝文件到另一台服务器
1.安装expect模块 $ yum install -y expect 2.编写scp免密码登录脚本 $ vim /localshell/expect.sh #!/usr/bin/expect #expect.sh #各院校应用备份同步一份到30.57, set timeout 10 set src_file [lindex $argv 0] spawn scp /hom...
scp/ssh shell(expect交互式键入密码)
                公司通过执行shell脚本检测服务器信息,然后保存至resultFile?文件中。完了之后需要down下来,写了个简单的shell,修改文件名并自动scp至本地机器! scp #!/bin/shPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PA...
运用shell 的expect达到不同服务器之间的交互
一,export的命令详解 expect 的核心是 spawn expect send set spawn 调用要执行的命令 expect 等待命令提示信息的出现,也就是捕捉用户输入的提示 send 发送需要交互值,代替用户手动输入的内容 set 设置变量值 set timeout 60 60秒超时 set timeout -1 永不超时 interact 执行完成后保持交互状态。...
shell使用expect进行交互式操作
1. 环境安装以centos环境为例:a. 安装tclb.安装expect2. 安装controllerinstall.sh#!/bin/bash/usr/bin/expect -v &amp;gt; /dev/null 2&amp;gt;&amp;amp;1if [ $? -ne 0 ]; then    echo &quot;Please install expect.&quot;    exitfiif [ $# -ne 1 ]; t...
scp远程拷贝expect实现SHELL
在LINUX上,我们可以很方便的使用scp命令来远程拷贝文件,但是由于scp命令本身无保存密码选项,所以在shell里面无法像samba那样子保存密码,比较麻烦,下面介绍下两种实现方法。 方法一: scp 远程拷文件,建议用搭配 ssh 方法:1: 在客户机上生成 ssh 需要的 rsa 密钥: ssh-keygen -t rsa2: 把生成的 id_rsa.pub拷到远程服务器用户的 .s...
用expect命令实现Shell的自动化交互
背景 linux脚本中有很多场景是进行远程操作的,例如远程登录ssh、远程复制scp、文件传输sftp等。这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的。为了实现自动化远程操作,我们可以借用expect的功能。 expect expect的核心是spawn、expect、send、set。 spa...
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo