【问题标题】:Python subprocess is not working as expected for find command对于 find 命令,Python 子进程没有按预期工作
【发布时间】:2019-02-11 07:28:29
【问题描述】:

我正在尝试在 python 中找出节点上的孤立文件。 下面是代码sn-p

#!/usr/bin/python
import subprocess
try:
        s = subprocess.check_output(["find", "/", "-fstype", "proc", "-prune", "-o", "\( -nouser -o -nogroup \)", "-print"])
except subprocess.CalledProcessError as e:
    print e.output
else:
    if len(s) > 0:
        print ("List of Orphan Files are \n%s\n" % s)
    else:
        print ("Orphan Files does not Exists on the NE")

当我尝试运行这个 python 代码时

> python test.py 
find: paths must precede expression: \( -nouser -o -nogroup \)
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

当我在 CLI 上运行相同的命令时,它工作正常。

> find / -fstype proc -prune -o \( -nouser -o -nogroup \) -print
/root/a

很少有人建议使用 shell=true,因为子进程的 python 文档是安全隐患。 Warning Using shell=True can be a security hazard.

【问题讨论】:

    标签: python linux subprocess


    【解决方案1】:

    只需将 shell=True 添加到您的 check_output 中

    s = subprocess.check_output(["find", "/", "-fstype", "proc", "-prune", "-o", "\( -nouser -o -nogroup \)", "-print"], shell=True)
    

    【讨论】:

      【解决方案2】:

      您应该在每个空格上拆分命令。最简单的方法是使用shlex.split

      import shlex
      import subprocess
      
      cmd = shlex.split('find / -fstype proc -prune -o \( -nouser -o -nogroup \) -print')
      subprocess.check_output(cmd)
      

      【讨论】:

        【解决方案3】:

        我尝试了您的脚本并得到了与您相同的错误。我正在尝试不同的事情,并找到了对我有用的东西。我变了

        -print
        

        -exec
        

        它奏效了。但我不确定为什么会出现这种行为。

        【讨论】:

          【解决方案4】:

          您可以设置shell=True 选项,然后传递整个shell 命令。我认为空格是导致问题的原因。

          s = subprocess.check_output("find / -fstype proc -prune -o \( -nouser -o -nogroup \) -print", shell=True)
          

          注意this warning 与设置shell=True 相关。如果输入来自外部源(如用户输入),基本上不要这样做。因此在这种情况下应该没问题。

          【讨论】:

          • 你能不能帮我理解一下,怎么会好?
          • @sach 你的 shell 命令是硬编码的。像command = raw_input("Enter a shell command > ") 然后subprocess.check_output(command, shell=True) 这样的东西可能很危险。
          【解决方案5】:

          每个命令行参数必须作为单独的列表项传递,包括括号及其内容:

          s = subprocess.check_output(["find", "/", "-fstype", "proc", "-prune", "-o",
                                      "(", "-nouser", "-o", "-nogroup", ")", 
                                      "-print"])
          

          【讨论】:

            猜你喜欢
            • 2012-03-14
            • 2016-12-24
            • 2012-04-12
            • 1970-01-01
            • 1970-01-01
            • 2016-03-08
            • 1970-01-01
            • 2023-03-17
            • 1970-01-01
            相关资源
            最近更新 更多