首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pexpect:期望各种行

pexpect:期望各种行
EN

Stack Overflow用户
提问于 2014-02-08 19:40:42
回答 2查看 3.2K关注 0票数 2

我正在尝试使用pexpect to scp服务器上的文件,但它似乎什么也没做(甚至连错误消息都没有)。下面是我的代码:

代码语言:javascript
复制
import pexpect
child=pexpect.spawn('scp -r user@host:route/file .')
child.expect("user@host's password:")
child.sendline('password')

我认为问题出在child.expect命令中,因为"user@host's password:“是包含特殊字符的大约30行欢迎消息的最后一行。有没有办法告诉pexpect期望不止一行或者简单的任何东西?或者只是等待X秒,然后输入密码?

编辑:它与child.wait()命令一起工作,但它在第9个文件处停止。碰巧第10个非常大(大约250Mb),我不知道是不是和它有关…谢谢你!!

编辑:我把这行

代码语言:javascript
复制
child.logfile=sys.stdout

之后

代码语言:javascript
复制
child=pexpect.spawn('scp -r user@host:route/file .')

我在屏幕上看到的是欢迎消息,而不是在文件中,它以"user@host's password:“结束,然后我在同一行中看到了密码,但我仍然没有得到文件。

有人知道怎么修吗?

谢谢大家!

EN

回答 2

Stack Overflow用户

发布于 2014-04-15 23:26:28

您可以查看pexpect的属性buffer:- pexpect.before #在匹配pexpect.expect中指定的正则表达式之前解析的字符串- pexpect.buffer #当前在缓冲区中的正则表达式- pexpect.after #匹配pexpect.expect中指定的正则表达式之后解析的字符串

请记住,child.expect()是一个阻塞调用,直到它匹配正则表达式或遇到EOF/TIMEOUT异常时才会返回。

票数 0
EN

Stack Overflow用户

发布于 2019-11-19 20:24:43

根据pexpect documentation的说法

给定

()的模式可以是正则表达式,也可以是正则表达式列表。这允许您匹配多个可选响应。expect()方法返回匹配模式的索引。例如,假设您想要登录到服务器。输入密码后,您可以从服务器获得各种响应-您的密码可能被拒绝;或者允许您进入并要求输入您的终端类型;或者可以让您直接进入并给出命令提示符。

以及文档中的示例:

代码语言:javascript
复制
child.expect('password:')
child.sendline(my_secret_password)
# We expect any of these three patterns...
i = child.expect (['Permission denied', 'Terminal type', '[#\$] '])
if i==0:
    print('Permission denied on host. Can\'t login')
    child.kill(0)
elif i==1:
    print('Login OK... need to send terminal type.')
    child.sendline('vt100')
    child.expect('[#\$] ')
elif i==2:
    print('Login OK.')
    print('Shell command prompt', child.after)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21645550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档