python - 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 命令时,我是否必须做任何不同的事情?
解决方案
这是因为你的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())
推荐阅读
- node.js - 无法在nodejs中获取基板序列号
- javascript - 删除字符
- android - 是否可以从应用程序获取 cookie?
- javascript - 我正在努力编辑我的页面的 DOM 元素
- angular - 如何从组件添加状态属性
- android - 如果没有连接,调用请求的最佳做法是每 4-5 秒重复一次调用,直到我们得到响应,使用 Rx
- dart - 如何将资产图像转换为文件?
- sql - Microsoft SQL Server 接受变量名称中的空白 - 为什么?
- node.js - 将 MongoDB 中的 JSON 文件导入 Nodejs 应用程序的最佳实践
- android - WebView 在显示来自 Google Docs 的 PDF 时随机打开白屏