从 Python 运行 Expect 脚本的最简单方法

Posted

技术标签:

【中文标题】从 Python 运行 Expect 脚本的最简单方法【英文标题】:Simplest way to run an Expect script from Python 【发布时间】:2012-06-25 00:09:38 【问题描述】:

我正在尝试指示我的 Python 安装执行 Expect 脚本“myexpect.sh”:

#!/usr/bin/expect
spawn ssh usr@myip
expect "password:"
send "mypassword\n";
send "./mycommand1\r"
send "./mycommand2\r"
interact

我使用的是 Windows,因此无法将 Expect 脚本中的行重写为 Python。有什么建议?有什么东西可以像“./myexpect.sh”那样从 bash shell 运行吗?


我在子进程命令方面取得了一些成功:

subprocess.call("myexpect.sh",  shell=True)

我收到错误:

myexpect.sh 不是有效的 Win32 应用程序。

我该如何解决这个问题?

【问题讨论】:

...您是在问如何在没有 bash 的情况下在 Windows 上运行 bash 脚本?我什至不知道 Python 是从哪里来的。此外,您可能应该为您的 shell 脚本提供 .txt 扩展名(.sh 如果有的话) @MateuszKowalczyk 在某种意义上是的:我想从 .py 文件自动运行此脚本 - 当我运行 .py 文件时,将调用期望脚本并作为.py 文件的序列。 所以看起来您根本没有在寻找与 python 相关的解决方案(除了它是由 Python 控制的事实)。您只需要一个能够读取期望脚本并执行它的 Windows 上的程序,对吗? @EricFinn 我正在寻找 python 解决方案 - 如果我从 cygwin 终端执行 myexpect.sh,它运行良好,但这不是我的最终目标。我想做的是让我的 python 脚本在我运行我的 .py 文件时执行我的 .sh 脚本,所以我不必在运行我的 .py 文件之前从终端手动执行它。 @gortron 但看起来你的问题并不是真正的 Python 特定的;您只是告诉操作系统将文件作为程序运行,并且允许操作系统运行所述文件的解决方案(很可能通过 Windows 端口的 Expect)将适用于任何语言,而不仅仅是 Python。或者也可以阅读脚本并自己用 Python 解释它? 【参考方案1】:

由于它是一个 .expect 脚本,我认为您应该更改脚本的扩展名。

而不是使用

subprocess.call("myexpect.sh", shell=True)

你应该使用

subprocess.call("myexpect.expect", shell=True)

【讨论】:

没关系,兄弟。既然有shebang,文件扩展名是什么都没有关系。【参考方案2】:

使用pexpect library。这是 Expect 功能的 Python 版本。

例子:

child = pexpect.spawn('Some command that requires password')
child.expect('Enter password:')
child.sendline('password')
child.expect(pexpect.EOF, timeout=None)
cmd_show_data = child.before
cmd_output = cmd_show_data.split('\r\n')
for data in cmd_output:
    print data

Pexpect 提供了许多可供学习的示例。对于interact() 的使用,请查看示例中的script.py

https://github.com/pexpect/pexpect/tree/master/examples

(对于 Windows,有 pexpect 的替代方案。)

Can I use Expect on Windows without installing Cygwin?

【讨论】:

如果您使用的是 Linux 平台,pexpect 是一个出色的解决方案,但没有适用于 Windows 平台的 pexpect 库。 @gortron:有一个关于 Windows 的 pexpect 等效项的 SO 讨论。我已将其添加到答案中。看看有没有帮助。 为了后代:winpexpect 是一个干净的解决方案。 @gortron:谢谢!好久没上windows平台了。 @gortron:Windows 上没有ssh 命令。我看不出在这里使用winpexpect 会有什么帮助。

以上是关于从 Python 运行 Expect 脚本的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

在云服务器中运行 python 脚本的最简单方法是啥?

自动化shell脚本except与python的pexpect模块

expect脚本远程登录远程执行命令和脚本传参简单用法

bash/expect/loop - 如何循环执行 telnet 的简单 bash 脚本

python3 - 使用脚本从父级到子级共享变量的最简单方法

Telnet/Send/Expect - 自动从远程主机拉取日志