2015-05-04 2 views
1

При выполнении этой команды с PythonNetStat не работает должным образом с POPEN

p = Popen(['netstat', '-atunp'], shell=True, stdout=PIPE, stderr=PIPE) 
stdout, stderr = p.communicate() 
print stdout 

Я получаю различный результат. То есть, если я запускаю ту же команду из командной строки, я могу видеть IP-адреса и имена приложений, тогда как с Python я не могу.

Есть ли что-нибудь еще, что мне нужно, чтобы увидеть IP-адреса и имена приложений?

+0

Можете ли вы показать нам выход вы получаете ? – fixxxer

+2

drop 'shell = True'. См. [Не использовать аргумент списка вместе с shell = True в подпроцессе docs] (http://bugs.python.org/issue21347) – jfs

ответ

1

Я думаю, что я управлял вашей командой без знака -p. Этот флаг ожидает протокол. Вероятно, поэтому ваша строка stdout пуста; stderr с другой стороны, будет иметь ошибку -

In [86]: stderr 
Out[86]: 'netstat: option requires an argument -- p\nUsage:\tnetstat [-AaLlnW] [-f address_family | -p protocol]\n\tnetstat [-gilns] [-f address_family]\n\tnetstat -i | -I interface [-w wait] [-abdgRt]\n\tnetstat -s [-s] [-f address_family | -p protocol] [-w wait]\n\tnetstat -i | -I interface -s [-f address_family | -p protocol]\n\tnetstat -m [-m]\n\tnetstat -r [-Aaln] [-f address_family]\n\tnetstat -rs [-s]\n\n' 

Так обновить вашу команду, как это (удаление shell=True и добавление протокола в качестве аргумента) -

In [87]: paste 
p = Popen(['netstat', '-atunp', 'tcp'], stdout=PIPE, stderr=PIPE) 
stdout, stderr = p.communicate() 
print stdout 

## -- End pasted text -- 
Active Internet connections (including servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address  (state)  
tcp4  0  0 192.168.1.100.53076 198.252.206.140.80  ESTABLISHED 
tcp4  0  0 192.168.1.100.53075 198.252.206.140.80  ESTABLISHED 
tcp4  0  0 192.168.1.100.53004 216.58.220.3.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52984 74.125.200.155.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52954 198.252.206.149.443 ESTABLISHED 
tcp4  0  0 192.168.1.100.52927 91.189.89.222.443  FIN_WAIT_1 
tcp4  0  0 192.168.1.100.52925 173.194.120.144.443 ESTABLISHED 
tcp4  0  0 192.168.1.100.52869 74.125.130.155.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52863 74.125.68.139.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52858 74.125.130.102.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52851 74.125.68.93.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52847 74.125.200.132.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52814 216.58.216.163.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52812 74.125.68.189.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52794 74.125.130.17.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52793 198.252.206.149.443 ESTABLISHED 
tcp4  0  0 192.168.1.100.52761 74.125.68.138.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52737 74.125.68.132.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52577 17.172.232.205.443  ESTABLISHED 
tcp4  0  0 192.168.1.100.52571 74.125.130.188.443  ESTABLISHED 
tcp6  0  0 fd9a:f3a0:3346:7.4488 *.*     LISTEN  
tcp4  0  0 *.*     *.*     CLOSED  
tcp4  0  0 127.0.0.1.631   *.*     LISTEN  
tcp6  0  0 ::1.631    *.*     LISTEN  
+0

'print stdout' из вопроса работает как уже есть. Проблема, вероятно, похожа на [Последняя небуферизованная строка не может быть прочитана] (http://stackoverflow.com/q/25923901/4279) – jfs

+0

Как я понимаю, OP хочет, чтобы выход netstat был декорирован, как он видит в командной строке. Разбираясь на новые линии, мы получаем тот же результат, что и терминал. – fixxxer

+0

№. Это неверно. 'stdout' - это строка (с возможностью вставки новых строк (' '\ n'' символов)). 'stdout.split ('\ n')' возвращает список Python. Результат, который вы видите, - 'repr (the_list)', который ** не **, что будет показывать терминал. – jfs