如何使用Pexpect执行root命令?

时间:2016-10-07 00:20:14

标签: python linux ubuntu pexpect

我正在使用python程序来协助apt-get工具。我想使用pexpect下载所选的包。我相信我会被困在child.expect线上。当谈到那条线时似乎超时了。

butt = "vlc"
child = pexpect.spawn('sudo apt-get install ' + butt)
child.logfile = sys.stdout
child.expect('[sudo] password for user1: ')
child.sendline('mypassword')

这是日志文件。

TIMEOUT: Timeout exceeded.
<pexpect.spawn object at 0xb5ec558c>
version: 3.2
command: /usr/bin/sudo
args: ['/usr/bin/sudo', 'apt-get', 'install', 'vlc']
searcher: <pexpect.searcher_re object at 0xb565710c>
buffer (last 100 chars): '[sudo] password for user1: '
before (last 100 chars): '[sudo] password for user1: '
after: <class 'pexpect.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 27641
child_fd: 4
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: <open file '<stdout>', mode 'w' at 0xb74d8078>
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

更新:

密码发送得很好。它也期望下一行,但随后进入&#34; Y&#34;什么都不做。

child = pexpect.spawn('sudo apt-get install ' + butt)
child.logfile = sys.stdout
child.expect_exact('[sudo] password for user1: ')
child.sendline('mypass')
child.expect_exact('Do you want to continue? [Y/n] ')
child.sendline('Y')

求助:

我需要在最后添加这一行。

child.expect(pexpect.EOF, timeout=None)

2 个答案:

答案 0 :(得分:1)

尝试public HttpResponseMessage Post(AddressModel addressModel) { if (addressModel.id != null) throw new Exception("identifier cannot be set"); // or return BadRequest using (var context = new DbContext()) { addressModel.id = GetNewId(); // GetNewId generate the next correct if from data // from context.address.last ... ... } }

来自文档:

  

expect()方法等待子应用程序返回给定的字符串。您指定的字符串是正则表达式,因此您可以匹配复杂的模式。

优良作法是仅在意图与正则表达式匹配时才使用child.expect_exact()

答案 1 :(得分:1)

当前的问题是:

child.expect('[sudo] password for user1: ')

使用正则表达式。 [...]构造在正则表达式中具有特殊含义,因此您实际等待的是其中一个字母“d”,“o”,“s”或“u”后跟文本{{ 1}}。但是password for user1:首先发送文本sudo,而正则表达式与之不匹配,因为它的最后一个字符是[sudo]而不是其中一个字母。

有很多可能的解决方案。您可以将其与]匹配。你可以按照JLeClerc的建议使用password for user1:(我也赞成这个解决方案)。您可以转义正则表达式中的括号,因此它们没有通常的含义:expect_exact()(请注意,当将其指定为Python字符串时,您需要将反斜杠加倍或使用原始字符串文字)。

另一个问题是,如果您在最近几分钟内已经提供了密码,则可能不会提示您输入密码。然后\[sudo\]电话肯定会超时等待它。解决此问题的最简单方法是首先发布expect()。您甚至可以在同一命令行上执行此操作:

sudo -k