考虑一个Linux服务器,它在用户的.bash_profile
中包含以下行:
echo "Hello world"
所以,每当你加入它时,你会看到Hello world
现在,请考虑以下fabric脚本:
#!/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', ...]
这是fabric中的错误吗?有没有办法抑制服务器输出?
time.sleep()
无效
答案 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
传递给远程bash调用
要解决此问题,您可以覆盖env.shell
以删除链接常见问题解答中所述的-l
标记。
所以改变
with cd('/'):
在您的代码中
with cd('/'), settings(shell='/bin/bash -c'):