如何可靠地使用 Fabric 的 cd() 上下文管理器



我正试图在远程系统的目录中运行find命令。Fabric有时会更改目录,但有时会失败,这取决于路径是否包含括号或空格,以及我是否使用shlex.quote((。正确的处理方法是什么?

我的代码基本上是这样的:

from shlex import quote
from fabric import Connection
with Connection(remote_login) as c:
with c.cd(quote(node.src)):    # Condition 1
# with c.cd(node.src):         # Condition 2
result = c.run(r"nice find -maxdepth 1 -type f -printf '%fn'", echo=True)

如果使用条件1,则当路径包含parens时,它将成功。在这种情况下,Fabric会生成以下行:

# Fabric output success with parens in path
cd '/data/PixelSizeTestRuby105mm(Zoom248.5mm)' && nice find -maxdepth 1 -type f -printf '%fn'

但当路径包含空格时,它会失败,因为空格是转义的,但路径也被引用,而不仅仅是一个或另一个。

# Fabric output failure for spaces in path
cd '/data/Crystal Bending Test/Bending0' && nice find -maxdepth 1 -type f -printf '%fn'
sh: line 0: cd: /data/Crystal Bending Test/Bending0: No such file or directory

如果我改为使用条件2,则第一条路径失败,第二条路径成功。

# Fabric output failure for parens in path
cd /data/PixelSizeTestRuby105mm(Zoom248.5mm) && nice find -maxdepth 1 -type f -printf '%fn'
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `cd /data/PixelSizeTestRuby105mm(Zoom248.5mm) && nice find -maxdepth 1 -type f -printf '%fn''

这是Invoke实现中的一个错误。它只是不为cd中的路径执行正确的shell参数转义。

作为一个快速修复方法,您可以通过在前面添加一个反斜杠来手动转义路径中的括号。正如您自己所注意到的,使用shlex.quote是行不通的。理想情况下,Invoke实现应该被修复为在内部使用shlex.quote,而不是它当前执行的特别的、有缺陷的手动转义。

相关内容

  • 没有找到相关文章

最新更新