Python Fabric:捕获run()输出时过滤掉服务器输出

时间:2014-03-23 00:28:17

标签: python fabric .bash-profile

考虑一个Linux服务器,它在用户的.bash_profile中包含以下行:

echo "Hello world"

所以,每当你加入它时,你会看到Hello world

现在,请考虑以下脚本:

#!/usr/bin/env python
from fabric.api import *

env.hosts = [...]

@task
def test():
    with cd('/'):
        print run('ls').split()

您希望它输出如下内容:     ['tmp', 'etc', 'var', ...]

但实际输出将是:     ['Hello', 'world', 'tmp', 'etc', 'var', ...]

这是中的错误吗?有没有办法抑制服务器输出?

time.sleep()无效

1 个答案:

答案 0 :(得分:1)

Fabric执行远程Bash shell in login mode。这会导致执行配置文件。您可以通过打开调试模式自行查看。在我的机器上以调试模式执行脚本会产生以下(除其他外)

[x.x.x.x] Executing task 'test'
[x.x.x.x] run: /bin/bash -l -c "cd / && ls"

注意-l传递给远程调用 要解决此问题,您可以覆盖env.shell以删除链接常见问题解答中所述的-l标记。

所以改变

with cd('/'):

在您的代码中

with cd('/'), settings(shell='/bin/bash -c'):