Virtuozzo与使用Python子进程自动化命令

1 投票
1 回答
649 浏览
提问于 2025-04-16 00:57

我正在处理一个Virtuozzo服务器,想用Python自动登录到每个容器里,并执行一些命令。我打算通过创建一个子进程来运行'vzctl enter '。

这是我现在正在使用的代码片段 -

#!/usr/bin/python

import subprocess

print 'Start'
proc = subprocess.Popen(['vzctl enter 123'], 
                             stdout=subprocess.PIPE, 
                             stdin=subprocess.PIPE,
                             shell=True)
print proc.communicate('whoami')[0]
print 'Finished'

但是我每次看到的输出是 -

Unable to get term attr: Invalid argument
Unable to restore term attr: Invalid argument

我觉得这可能是BASH的错误,有人能给我点建议吗?

1 个回答

2

看起来,vzctl这个工具需要标准输入和输出是一个终端。你可以通过一些实验来确认这一点(在bash中试试):

$ echo whoami | vzctl enter 123  # stdin is not a tty

$ vzctl enter 123 | cat          # stdout is not a tty
whoami
<ctrl-d>

你可以使用标准库中的pty模块来创建伪终端,但这个模块比较底层,不太容易使用。

还有一个第三方模块叫pexpect,可能会更适合你的需求。

撰写回答