sudo cd进入Fabric的目录

时间:2012-11-19 16:53:42

标签: python sudo fabric

我是Fabric的新手,我正试图进入一个我无法获得许可的目录,所以我正在使用sudo。 (目录上的权限是drwx ------,即700)

我正在使用Fabric 0.9.7。

我试过了:

from fabric.api import run, env
from fabric.context_managers import cd

env.hosts = [ '1.2.3.4' ]
env.user = 'username'

def test():
       run('sudo cd /my/dir')
              run('ls')

但是这给了我"对不起,你必须有一个tty来运行sudo"这是可以理解的。我也试过这个:

剪断:

def test():
        with cd('/my/dir'):
                run('ls')

但是这会返回"许可被拒绝",再次可以理解。

简而言之,我如何" sudo cd"在Fabric中?

3 个答案:

答案 0 :(得分:3)

这是因为cd是shell内置命令,而不是可以使用sudo运行的实际程序。您与with cd(...):走在了正确的轨道上。尝试类似:

with cd('/my/dir'):
    sudo('ls')

认为会起作用,尽管我自己还没有尝试过。这是因为cd上下文管理器的工作方式是将cd <dirname> &&添加到使用run()sudo()运行的任何命令。

答案 1 :(得分:3)

您是否有任何理由不仅仅使用sudo()?它可以解决您遇到的问题。

如果您在1.0之前使用Fabric版本,则需要明确tell it to create a TTY

sudo("ls", pty=True)

否则,您可能需要编辑您的sudoers文件并删除或注释掉这一行:

Defaults    requiretty 

应该是:

#Defaults    requiretty

此外,它可能更烦人,但如果with cd(...)导致问题,您始终可以将路径作为参数传递给ls

sudo("ls /my/dir")

答案 2 :(得分:0)

正如其他人所解释的,cd 是 Linux 中内置的 shell,但 sudo 仅适用于可执行文件,因此 sudo cd 无法工作。

因此,即使在最新的 Fabric 中使用 with c.cd()sudo() 也不起作用,此任务:

@task
def pwd(c):
    with c.cd('/tmp'):
        c.sudo('pwd')

导致以下错误:

sudo: cd: command not found

可以说没有吸引力的解决方法是使用 sudo() 作为命令启动一个新的 shell,并手动为其添加前缀 cd

@task
def pwd(c):
    c.sudo('sh -c "cd /tmp && pwd"')

this Invoke issue