首页 > 解决方案 > python shell命令管道grep没有结果

问题描述

我正在尝试从 python 中的 cpanel 用户获取域名。

这是我的代码:

import subprocess
user = "testuser"
getuserdata = 'cat /var/cpanel/users/' + user
getdnsline = 'grep "DNS="'
test = 'wc -l'

userdataprocess = subprocess.Popen(getuserdata.split(), stdout=subprocess.PIPE)

testprocess = subprocess.Popen(test.split(), stdin=userdataprocess.stdout, stdout=subprocess.PIPE)

test, error = testprocess.communicate()
print(test)

dnslineprocess = subprocess.Popen(getdnsline.split(), stdin=userdataprocess.stdout, stdout=subprocess.PIPE)

website, error = dnslineprocess.communicate()
print(website.decode('utf-8').splitlines())

我的输出是:

b'60\n'
[]

所以这意味着 wc -l 命令返回 60 行。因此,将第一个 getuserdata 命令的输出传递给 wc -l 命令是可行的。

但是,grep 命令总是返回空白。无论我输入“DNS =”还是“=”甚至是“a”。该文件是普通的cpanel用户文件,我已经验证了DNS在文件中。

当我刚刚从第一个进程 userdataprocess 输出数据时,我可以手动检查 DNS 条目。

以这种方式使用 grep 命令时,我是否必须做任何不同的事情?

标签: pythonsubprocesspipe

解决方案


这是因为你的testprocess.communicate()forwc -l命令实际上已经消耗了所有的输出userdataprocess.stdout并关闭了它,所以没有什么dnslineprocess.communicate()可读取的了。

您应该改为将 的输出读userdataprocess.stdout入一个变量,然后将其用作 和 的testprocess.communicate()输入dnslineprocess.communicate()

此外,正如@pyb 指出的那样,您DNS=grep命令中进行了不必要的引用,如果没有外壳,该命令将被传递给grep作为过滤字符串的一部分的双引号。您应该简单地删除它们,因为您的过滤器字符串中没有特殊字符。

import subprocess
user = "testuser"
getuserdata = 'cat /var/cpanel/users/' + user
getdnsline = 'grep DNS='
test = 'wc -l'

userdataprocess = subprocess.Popen(getuserdata.split(), stdout=subprocess.PIPE)

userdata = userdataprocess.stdout.read()

testprocess = subprocess.Popen(test.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE)

test, error = testprocess.communicate(userdata)
print(test)

dnslineprocess = subprocess.Popen(getdnsline.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE)

website, error = dnslineprocess.communicate(userdata)
print(website.decode('utf-8').splitlines())

推荐阅读