Почему echo> / dev / udp / ... не работает из subprocess.Popen () или os.system ()? - PullRequest
0 голосов
/ 05 июля 2019

Я пишу скрипт на python (2.7), в котором мне нужно выполнить некоторые команды оболочки, которые будут отправлять UDP-пакеты на удаленную виртуальную машину. Для выполнения команды я использую подпроцесс lib, а также методы Popen и call.

Следующий код показывает мои 2 подхода к отправке пакета UDP. Проблема в том, что ни один из них (call или Popen) не работает (и не работает os.system). Команда интерпретируется как одиночное эхо строки «hello> /dev/udp/192.168.85.36/3000», как показано, когда я печатаю вывод из ТРУБЫ.

myCmd = 'echo hello > /dev/udp/192.168.85.36/3000'

subprocess.call(myCmd, shell=True)

subprocess.Popen(myCmd.split(), stderr=subprocess.PIPE,\ 
                 stdout=subprocess.PIPE)

subprocess.Popen(['echo', 'packet', '>','/dev/udp/192.168.85.36/3000'],\
                  shell=False, stderr=subprocess.PIPE,stdout=subprocess.PIPE)

Интересно то, что когда я выполняю ту же самую команду непосредственно в терминале, пакет UDP принимается в удаленной виртуальной машине. Разница в том, что внутри программы команда echo находится внутри цикла, выполняемого несколько раз (что является ожидаемым поведением). Есть идеи?

1 Ответ

3 голосов
/ 05 июля 2019

Есть две проблемы, которые мешают этому работать:

  1. Вы передаете > и /dev/udp/.. на echo.Обработка > не является работой echo.Это до снаряда.Если вы не вызываете оболочку, это ваша работа.
  2. /dev/udp не является реальным устройством / каталогом.Bash перехватывает его и вместо этого открывает сокет.Если вы не запускаете bash (и обратите внимание, что shell=True и os.system вместо этого будут запускать sh), открытие сокета будет вашей работой .

Самый простой способ исправить это, не взяв на себя эту дополнительную работу, это вызвать bash, чтобы сделать это:

subprocess.Popen(['bash', '-c', 'echo packet > /dev/udp/192.168.85.36/3000'], shell=False, stderr=subprocess.PIPE, stdout=subprocess.PIPE)

Лучший способ исправить это - использовать Python.Функциональность UDP, см., Например, Отправка Python UDP-пакета

...