假设我正在尝试为test.sh编写一个expect脚本,它有三个提示:prompt1,prompt2,prompt3.
我的代码是这样的:
spawn test.sh
expect "prompt1"
send "pass1"
expect "prompt2"
send "pass2"
expect "prompt3"
send "pass3"
Run Code Online (Sandbox Code Playgroud)
但是,prompt2只出现一半的时间.如果prompt2没有显示,则expect脚本会中断.如果没有显示,我如何编写跳过prompt2的期望代码?
编辑:
修正了我的代码:
/usr/bin/expect -c '
spawn ./test.sh
expect {
      "prompt1" {
          send "pass1\r"
          exp_continue
      }
      "prompt2" {
          send "pass2\r"
          exp_continue
      }
      "prompt3" {
          send "pass3\r"
          exp_continue
      }
}
interact return
'
Run Code Online (Sandbox Code Playgroud)
"
这样,脚本的其余部分执行并提供输出.
Expect是一个用于生成子应用程序并控制它们的模块.我对Python和Ruby感兴趣.
我使用NMock2,并且我已经起草了以下NMock类来表示一些常见的模拟框架概念:
Expect:这指定了一个模拟方法应返回的内容,并说必须进行调用或测试失败(当伴随调用时VerifyAllExpectationsHaveBeenMet()).
Stub:this指定模拟方法应返回的内容,但不能导致测试失败.
那我该怎么做呢?
我正在使用以下代码将一些输入传递给具有pexpect的进程:
p = pexpect.spawn('cat', timeout=5.0 )
p.maxread = 5000
p.setecho(False) # prevent the process from echoing stdin back to us
INPUT_LEN = 1024
p.sendline('a'*INPUT_LEN)
print p.readline() # pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
Run Code Online (Sandbox Code Playgroud)
当INPUT_LEN <1024时,一切正常,但是对于> = 1024个字符,进程没有收到完整输入,导致在p.readline()上引发"pexpect.TIMEOUT"错误.
我尝试将输入分成小于1024个字符的片段,但这有同样的问题:
p = pexpect.spawn('cat', timeout=5.0 )
p.maxread = 5000
p.setecho(False)
INPUT_LEN = 1024
p.send('a'*1000)
p.sendline('a'*(INPUT_LEN-1000))
print p.readline() # pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
Run Code Online (Sandbox Code Playgroud)
有谁知道如何使用超过1024个字符的输入使pexpect工作?我试着查看源代码,但它似乎只是在调用os.write(...).
(作为旁注,我注意到当我从shell运行"cat"并尝试使用"Cmd + V"粘贴> = 1024个字符时发生相同的截断错误.但是,如果我运行"pbpaste,一切正常|猫".)
谢谢!
更新: 对"os.write()"的调用返回1025,表示写入成功,但os.read()返回"\ x07"(单个字符BEL),然后在下一次调用时挂起,导致超时.
将os.write()调用分为两个1024字节的write(),由os.fsync()调用分隔,不会改变任何东西.
我在我的脚本中使用以下命令,将主机添加到ssh中的已知主机.
VAR2=$(expect -c '
 spawn ssh -o StrictHostKeyChecking=no '"$REMOTE_HOST_USER@$REMOTE_HOST_IP"'
 expect "*?assword:*"
 send "'"$REMOTE_HOST_PASSWD"'\r"
 expect { 
 "Permission denied, please try again." {
 exit '"$WRONG_PASSWORD"' 
 }
 }
 ')
Run Code Online (Sandbox Code Playgroud)
工作正常,但如果主机已经在known_hosts中,我需要在命令之前进行控制,如果已经在known_hosts中,则不需要执行命令.如何检查主机是否在known_hosts中?
我正在使用expect在我的服务器上启动一个应用程序:
#!/usr/bin/expect
set timeout -1
spawn "bin/start-all.sh"
expect {
    -re "Found MongoDB in" { send "y\r"; exp_continue }
    -re "Found Hadoop in" { send "y\r"; exp_continue }
    -re "Going to start Hadoop" { interact }
}
Run Code Online (Sandbox Code Playgroud)
我可以在脚本运行的几秒钟内访问我的服务器上的应用程序,但是一旦它结束,应用程序就会变得不可用.
我在调试模式下运行expect并在结束时获得以下输出:
expect: does "vendors area. Do you want to start it? [y/n] y\r\n" (spawn_id exp6) match regular expression "Found MongoDB in"? Gate "Found MongoDB in"? gate=no
"Found Hadoop in "? Gate "Found Hadoop in "? gate=no
"Going to start Hadoop"? Gate "Going to …Run Code Online (Sandbox Code Playgroud) 环境:centos7 + mariadb5.5.64。
让我在屏幕上显示安装信息何时运行mysql_secure_installation。
# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): …Run Code Online (Sandbox Code Playgroud) 我写了一个期望内部的bash脚本,连接到终端服务器和清除行.我无法弄清楚我得到的错误,因为我已经给了所有必要的括号.我也不理解couldn't read file "line": no such file or directory错误.请帮助.
我的剧本:
#!/bin/bash  
VAR=$(expect -c "  
spawn telnet 1.1.1.1   
expect {  
       "Password:" { send "password\r" ; exp_continue}  
       "Prompt>" { send "en\r" ; exp_continue}  
       "Password:" { send "password\r" ; exp_continue}  
       "Prompt#" {send "clea line 10\r" ; exp_continue}  
       "[confirm]" {send "Y\r" ; exp_continue}  
       "Prompt#" {send "clea line 11\r" ; exp_continue}  
       "[confirm]" {send "Y\r" ; exp_continue}  
       "Prompt#" {send "exit\r" }  
    }  
")  
echo $VAR  
Run Code Online (Sandbox Code Playgroud)
它的输出:
missing close-brace  
    while executing  
"expect"  
couldn't read file …Run Code Online (Sandbox Code Playgroud) 我想在python3中使用类似expect的模块.据我所知,无论是pexpect还是fabric都没有使用python3.我可以使用任何类似的包吗?(如果不是,有人知道py3支持是否在任何项目的路线图上?)
不需要完全重叠的功能集.我不认为我的使用情况下,有必要在这里,但我基本上重新实现Linux的期待脚本,做一些配置提供的命令远程登录,但扩展功能.
嗨,根据这篇文章,unbuffer通过伪终端(pty)连接到命令,这使得系统将其视为交互式进程,因此不使用任何stdout缓冲.
我想在Windows上使用此功能.我可以知道unbufferWindows 上程序的等价物吗?谢谢.