在Fabric 2 / Invoke中:更改目录并使用sudo

时间:2018-06-13 09:48:35

标签: python fabric

这很好用

@task
def foo(context):
    with context.cd('/'):
        context.run('pwd')

输出:

/

但这不是:

@task
def bar(context):
    with context.cd('/'):
        context.sudo('pwd', password='mysecretpassword')

输出:

[sudo] password: sudo: cd: Befehl nicht gefunden

如何运行第二个示例?

2 个答案:

答案 0 :(得分:2)

事实证明,这是一个尚未修复的调用错误。

https://github.com/pyinvoke/invoke/issues/459

编辑:

这是我现在的解决方法:

context.sudo('bash -c cd“/&& pwd”')

答案 1 :(得分:0)

扩展@mogoh的回答。

正确的方法是将整个命令包含在双引号中,如下所示:

context.sudo('bash -c "cd /some/path && ls"')

由于命令可能会变得越来越大并遵循DRY原理,因此我创建了一个函数来对此进行包装:

def sudo_cd(context, path, command):
    """Workaround on the problem of cd not working with sudo command"""
    context.sudo(f'bash -c "cd {path} && {command}"')

在上面的示例中,我们像这样使用它:

sudo_cd(context, '/some/path', 'ls')