簡體   English   中英

為什么不能在subprocess.Popen()或os.system()中回顯> / dev / udp / ...?

[英]Why doesn't echo > /dev/udp/… work from subprocess.Popen() or os.system()?

我正在編寫一個python(2.7)腳本,在其中必須執行一些shell命令,這些命令會將UDP數據包發送到遠程VM。 為了執行命令,我使用了子進程lib,同時使用了Popen和call方法。

以下代碼顯示了我的兩種發送UDP數據包的方法。 問題是,它們(調用或Popen)都不起作用(對此,os.system也不起作用)。 該命令被解釋為字符串“ hello> /dev/udp/192.168.85.36/3000”的單個回顯,如我從PIPE打印輸出所示。

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)

有趣的是,當我直接在終端中執行完全相同的命令時,遠程VM會收到UDP數據包。 區別在於,在程序內部,echo命令在循環內部,執行多次(這是預期的行為)。 有任何想法嗎?

有兩個問題阻止了此工作:

  1. 您正在傳遞>/dev/udp/.. echo 處理>不是echo的工作。 這取決於外殼。 如果您不調用外殼程序,那是您的工作。
  2. /dev/udp不是真實的設備/目錄。 Bash攔截了它並打開了一個套接字。 如果您不運行bash(請注意shell=Trueos.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數據包

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM