我正在尝试从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命令时,我是否需要做任何不同的事情?
答案 0 :(得分:1)
这是因为您的testprocess.communicate()
命令的wc -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())
答案 1 :(得分:1)
由于DNS=
周围的引号,您的脚本失败。
您可以使用shell=True
来使脚本起作用:
dnslineprocess = subprocess.Popen(getdnsline, stdin=userdataprocess.stdout, stdout=subprocess.PIPE, shell=True)
来源:Passing double quote shell commands in python to subprocess.Popen()?