2012-11-19 72 views
2

我是新来的织物,我想cd到我没有权限的目录,所以我使用sudo。 (目录上的权限是drwx ------,即700)sudo cd到织物目录

我正在使用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') 

但这返回拒绝 “权限”,又可以理解的。

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

回答

3

这是因为cd是一个壳内建命令,而不是能够与sudo上运行的实际程序。您与with cd(...):在正确的轨道上。尝试是这样的:

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

认为,将工作,但无可否认我还没有尝试过自己。这是因为cd上下文管理器的工作方式是冠以cd <dirname> &&任何命令,以run()sudo()

3

是不是有什么理由不仅仅使用sudo()?它可能会解决您遇到的问题。

如果您使用的是版本面料1.0之前,你需要明确tell it to create a TTY

sudo("ls", pty=True) 

否则,你可能需要编辑sudoers文件,并删除或注释掉该行:

Defaults requiretty 

应该是:

#Defaults requiretty 

而且,它可能是更烦人,b UT如果with cd(...)引起的问题,您可以随时路径作为参数传递给ls

sudo("ls /my/dir") 
+0

我得到“NameError:全局名称‘须藤’没有定义”当我做了高清测试():命令(“LS “,pty = True) - 可能语法错误。 – ibash

+0

@ user1283693你需要像import'run'一样导入它:'from fabric.api import run,env,sudo' –

+0

如果“语法”错了,你会从Python得到一个'SyntaxError': – Iguananaut