我在远程计算机上运行命令:
remote_output = run('mysqldump --no-data --user=username --password={0} database'.format(password))
我想捕获输出,但没有全部打印到屏幕上。最简单的方法是什么?
答案 0 :(得分:33)
听起来Managing output部分是您正在寻找的部分。
要隐藏控制台的输出,请尝试以下操作:
from __future__ import with_statement
from fabric.api import hide, run, get
with hide('output'):
run('mysqldump --no-data test | tee test.create_table')
get('~/test.create_table', '~/test.create_table')
Belows是样本结果:
No hosts found. Please specify (single) host string for connection: 192.168.6.142
[192.168.6.142] run: mysqldump --no-data test | tee test.create_table
[192.168.6.142] download: /home/quanta/test.create_table <- /home/quanta/test.create_table
答案 1 :(得分:19)
如果要隐藏日志中的所有内容并在命令失败时避免结构抛出异常,请尝试此操作:
from __future__ import with_statement
from fabric.api import env,run,hide,settings
env.host_string = 'username@servernameorip'
env.key_filename = '/path/to/key.pem'
def exec_remote_cmd(cmd):
with hide('output','running','warnings'), settings(warn_only=True):
return run(cmd)
之后,您可以检查命令结果,如下例所示:
cmd_list = ['ls', 'lss']
for cmd in cmd_list:
result = exec_remote_cmd(cmd)
if result.succeeded:
sys.stdout.write('\n* Command succeeded: '+cmd+'\n')
sys.stdout.write(result+"\n")
else:
sys.stdout.write('\n* Command failed: '+cmd+'\n')
sys.stdout.write(result+"\n")
这将是程序的控制台输出(观察到没有来自结构的日志消息):
* Command succeeded: ls Desktop espaiorgcats.sql Pictures Public Videos Documents examples.desktop projectes scripts Downloads Music prueba Templates * Command failed: lss /bin/bash: lss: command not found
答案 2 :(得分:0)
对于fabric == 2.4.0,您可以使用以下逻辑隐藏输出
conn = Connection(host="your-host", user="your-user")
result = conn.run('your_command', hide=True)
result.stdout.strip() # here you can get the output
答案 3 :(得分:0)
正如其他答案所暗示的那样,问题问世八年后,fabric.api
不再存在(截至撰写之时,fabric==2.5.0
)。但是,这里的下一个最新答案意味着向每个hide=True
调用提供.run()
是唯一/可接受的方法。
不满意,我去寻找一种合理的等效条件,这种情况下我只能指定一次。感觉应该还有一种使用invoke.context.Context
的方法,但是我不想花更多的时间,而我能找到的最简单的方法是使用invoke.config.Config
,我们可以通过{ {3}},而无需任何其他导入。
>>> import fabric
>>> c = fabric.Connection(
... "foo.example.com",
... config=fabric.config.Config(overrides={"run": {"hide": True}}),
... )
>>> result = c.run("hostname")
>>> result.stdout.strip()
'foo.example.com'