【问题标题】:Execute shell command using Python subprocess使用 Python 子进程执行 shell 命令
【发布时间】:2018-09-08 00:30:27
【问题描述】:

我想通过 python 脚本执行以下命令:

sudo cat </dev/tcp/time.nist.gov/13

我完全可以通过命令行执行这个命令。但是,当我使用子进程执行它时,出现错误:

Command ['sudo','cat','</dev/tcp/time.nist.gov/13'] returned non-zero exit status 1

我的代码如下

import subprocess
subprocess.check_output(['sudo','cat','</dev/tcp/time.nist.gov/13'])

正如我上面提到的,通过命令行执行命令会给出所需的输出而不会出现任何错误。我正在使用 Raspbian Jessie 操作系统。有人能指出我正确的方向吗?

【问题讨论】:

  • 重定向运算符&lt; 是shell 功能的一部分。你的调用不使用shell所以cat直接处理参数(不理解)
  • @MichaelButscher 感谢您的回复。那么如何使用子进程执行这个命令呢?
  • check_output 支持 shell 参数

标签: python subprocess


【解决方案1】:

您根本不想为此使用subprocess

这个命令的真正作用是什么?它使用 bash 扩展打开网络套接字,通过 cat(1) 将其重新路由到标准输出,并决定以 root 身份运行 cat。在 Python 中执行这些操作并不需要 bash 扩展、/bin/cat 或 root 权限;您正在寻找 socket 库。

这是一个全 Python 的等价物:

#!/usr/bin/env python3
import socket
s = socket.create_connection(('time.nist.gov', 13))
try:
    print(s.recv(4096))
finally:
    s.close()

(请注意,我的所有实验都表明此连接有效,但白天服务器通过立即关闭来响应。例如,更简单的 shell 调用 nc time.nist.gov 13 也返回空字符串。)

【讨论】:

  • 有效。谢谢:)
  • 你能解释一下为什么 subprocess 是解决这个问题的错误方法吗?除了它对 Umar 不起作用之外,哈哈
  • 一般来说,如果可以的话,尝试用一种本地语言来做事情既容易又快捷。如果您将subprocess 用于基本文件 I/O(ls cat grep sed ...)(或者在本例中为网络 I/O),您应该只使用本地语言原语。
【解决方案2】:

试试这个:

import subprocess

com = "sudo cat </dev/tcp/time.nist.gov/13"

subprocess.Popen(com, stdout = subprocess.PIPE, shell = True)

【讨论】:

  • 不起作用,错误:无法打开 /dev/tcp/time.nist.gov/13L 没有这样的文件或目录
  • 把它变成完整路径。我不知道你的电脑上是什么。即,C:/User/.../dev/tcp/time.nist.gov/13。或者将脚本放入与您尝试调用的应用程序相同的文件夹中。
最近更新 更多