3

我是 Fabric 的新手,我正在尝试 cd 进入一个我没有权限的目录,所以我正在使用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 中“”?

4

3 回答 3

3

这是因为cd它是一个 shell 内置命令,而不是一个可以运行的实际程序sudo。你在正确的轨道上with cd(...):。尝试类似:

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

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

于 2012-11-19T16:59:42.290 回答
3

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

如果您使用的是 1.0 之前的 Fabric 版本,则需要明确告诉它创建一个 TTY

sudo("ls", pty=True)

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

Defaults    requiretty 

应该:

#Defaults    requiretty

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

sudo("ls /my/dir")
于 2012-11-19T17:05:52.683 回答
3

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

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

@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"')

请参阅此调用问题

于 2020-12-19T21:41:35.717 回答