Выполнить команду оболочки, используя подпроцесс Python - PullRequest
0 голосов
/ 08 сентября 2018

Я хочу выполнить следующую команду через скрипт 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 OS. Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Вы вообще не хотите использовать subprocess для этого.

Что на самом деле делает эта команда? Он использует расширение bash для открытия сетевого сокета, передает его через cat (1), чтобы перенаправить его на стандартный вывод, и решает запустить cat от имени пользователя root. Вам действительно не нужно расширение bash, или /bin/cat, или привилегии root, чтобы делать все это в Python; Вы ищете библиотеку socket .

Вот эквивалент всего Python:

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

(Обратите внимание, что все мои эксперименты показывают, что это соединение работает, но дневной сервер отвечает, немедленно закрываясь. Например, более простой вызов оболочки nc time.nist.gov 13 также возвращает пустую строку.)

0 голосов
/ 08 сентября 2018

Попробуйте:

import subprocess

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

subprocess.Popen(com, stdout = subprocess.PIPE, shell = True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...