我想使用Fabric并在本地运行命令,而不必建立任何其他连接。
如何在结构2 中执行此操作? ... documentation似乎想举任何例子。
答案 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)
请再次注意,这两个命令仅用于本地开发任务!