如何使用结构2运行本地命令?

时间:2018-08-10 20:35:16

标签: python fabric

我想使用Fabric并在本地运行命令,而不必建立任何其他连接。

如何在结构2 中执行此操作? ... documentation似乎想举任何例子。

4 个答案:

答案 0 :(得分:1)

运行,sudo和本地的操作相同:

from fabric import Connection                                                                                  

cn = Connection('scott@104.131.61.12')    # presumes ssh keys were exchanged                                        

cn.run('ls -al')     # assuming ssh to linux server - as scott                  
cn.sudo('whoami')    # as root                                                  
cn.local('echo ---------- now from local')                                      
cn.local('dir /w')   # assuming client is windows                               

答案 1 :(得分:1)

local命令放入架构2的设计决定是PITA IMHO,但我能够通过使用Invoke的Context而非Connection来模拟它。

from fabric import Connection
from invoke.context import Context

@task
def hostname(c):
    c.run('hostname')

@task
def test(c):
    conn = Connection('user@host')
    hostname(conn)
    local_ctx = Context(c.config)  # can be passed into @task;
                                   # Connection is a subclass of Context
    hostname(local_ctx)

答案 2 :(得分:0)

我要添加@ TheRealChx101的注释,因为我遇到了Connection.local的麻烦。 并非所有的env变量都进入了pty,因此我的某些脚本无法正常工作。

使用import from invoke run as local节(调用本地而不是Fabrics),一切正常。

答案 3 :(得分:0)

经过几次不同的尝试并花费大量时间后,我发现了这种优雅的解决方案,用于启动服务器(pty = True)和运行本地命令。

fabfile.py

from fabric import task

@task
def env_test(c):
    c.run("env", replace_env=False)

@task
def go(c):
    c.run("manage.py runserver", replace_env=False, pty=True)

请再次注意,这两个命令仅用于本地开发任务!

进一步阅读: Fabric2 ConnectionsUpgrading from 1.x