【问题标题】:sudo cd into a directory with Fabricsudo cd 进入带有 Fabric 的目录
【发布时间】:2012-11-19 16:53:41
【问题描述】:

我是 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')

但这会返回“权限被拒绝”,这也是可以理解的。

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

【问题讨论】:

    标签: python sudo fabric


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      你有什么理由不只是使用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")
      

      【讨论】:

      • 我在执行 def test(): sudo("ls", pty=True) 时收到“NameError: global name 'sudo' is not defined” - 可能是语法错误。
      • @user1283693 您需要像使用 run 一样导入它:from fabric.api import run, env, sudo
      • 如果“语法”错误,你会从 Python 中得到 SyntaxError :)
      • 是的,行得通! pty=True 和 import sudo 解决了我的问题。谢谢。
      • @ibash 当有人解决了您的问题时,您可以通过单击旁边的复选标记将他们​​的答案标记为已接受。您还可以通过单击箭头对任意数量的答案(对任何问题)进行投票。这两件事都会奖励帮助你的人。我在对您的问题的评论中链接到了一个关于它的常见问题解答。
      【解决方案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"')
      

      this Invoke issue

      【讨论】:

        猜你喜欢
        • 2012-01-03
        • 2013-08-21
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 2019-11-02
        • 1970-01-01
        • 2017-12-26
        • 1970-01-01
        相关资源
        最近更新 更多