我是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中?
答案 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"')