2014-10-14 6 views
0

Как я могу использовать команду Баш в питона, например:Bash в программе питона

# ifconfig eth0 promisc 

в коде, как:

import socket 
# the public network interface 
HOST = socket.gethostbyname(socket.gethostname()) 
# create a raw socket and bind it to the public interface 
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 
s.bind((HOST, 0)) 
# Include IP headers 
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) 
# receive all packages 
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) 
# receive a package 
print s.recvfrom(65565) 
# disabled promiscuous mode 
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF) 

вместо s.ioctl, потому что Linux не поддерживает эту команду?

+0

@PadraicCunningham: Я бы предпочел, чтобы мы не продвигали пренебрежение кодами возврата. 'check_call' всегда следует использовать по умолчанию, если не существует конкретной причины, по которой ошибки следует игнорировать. –

+0

Посмотрите на использование 'fcntl.ioctl' вместо того, чтобы обрезать' ifconfig', если 'socket.ioctl' недоступен. (Или используйте его в предпочтении 'socket.ioctl'.) – chepner

ответ

2
import subprocess 
subprocess.check_call(['ifconfig', 'eth0', 'promisc']) 

Или используйте check_output, если вы хотите, чтобы он возвращал текст из команды. При сбое команды автоматически будет генерироваться исключение.

+1

Если вы специально хотите использовать функции' bash', такие как расширение подстановочных знаков, используйте опцию оболочки: 'subprocess.check_call (« ls * », shell = True)' – Flimm

+2

@ Flimm: может быть, но 'ls *' - плохой пример, потому что он побуждает людей не использовать лучшие инструменты, такие как 'os.listdir()'. В любом случае подстановочные знаки не имеют отношения к случаю использования ОП. –

Смежные вопросы