cat:无效选项 - 尝试从python子进程运行linux命令时出现'F'错误

时间:2017-05-30 06:55:28

标签: python linux bash awk subprocess

要运行的命令

['ssh', 'tara@ds0', 'sudo', 'cat', '/etc/shadow', '|', 'awk', '-F":"', "'{print $1}'", '|', 'uniq']
    <><><><><>
    Successfuly fetched from  ds0 /etc/shadow

['sudo', 'cat', '/etc/shadow', '|', 'awk', '-F":"', "'{print $1}'", '|', 'uniq']
    <><><><><>

    cat: invalid option -- 'F'

正如您在上面所看到的,我保持命令在列表中运行,该列表由python subprocess 模块运行 这里的问题是 ssh 的第一个命令工作正常,但在 localhost 中运行命令抛出无效选项-F错误

我使用-F过滤结果以从结果中删除密码。

我已经测试了手动运行sudo cat /etc/shadow | awk -F':' '{print $1}' | uniq的代码并且它正在运行并给我预期的结果

为什么我收到错误:cat invalid option - 'F'。哪里可能有问题。为什么子进程无法处理它。

2 个答案:

答案 0 :(得分:1)

子进程将视为|或-F是猫参数。猫没有这个参数。如果你有列表并希望像这样使用子进程。

 p = ['sudo', 'cat', '/etc/shadow', '|', 'awk', '-F":"', "'{print $1}'", '|', 'uniq']
output = subprocess.check_output(' '.join(p),shell=True)
print output # you will get expected output

OR .......如果你想给字符串

p = 'sudo cat /etc/shadow | awk -F: '{print $1}' | uniq'
output = subprocess.check_output(' '.join(p),shell=True)
print output # you will get expected output

答案 1 :(得分:0)

.tabs('option', 'collapsible', false)是一个管道运算符,由shell解释。要解释它,您需要告诉子进程您的命令将在shell中运行 - 您可以通过添加关键字参数|来执行此操作。如果没有这个,你将执行带有几个参数的cat命令,其中包括shell=True|。并且-F":"不是cat的有效选项(如错误消息所示)。