Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выбор интерфейса, Выбор сетевого интерфейса скриптом 
:(
    Опции темы
demoriz
Дата 29.4.2009, 16:47 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2008
Где: г. Псков

Репутация: нет
Всего: нет



На сервере (VPS debian) шесть IP адресов на шести интерфейсах venet0:0 venet0:1 venet0:2 и тд. Есть робот который выходит в интрернет для сбора информации с одного сайта. Для выхода использую urllib2.
Код

def geturl(self, host):
        txheaders = {
            "User-Agent" : "Opera/9.64 (Windows NT 5.1; U; en) Presto/2.1.1",
            'Accept-Language': 'en-us',
            'Cache-Control': 'max-age=0'
        }
        req = urllib2.Request(host, None, txheaders)
        return urllib2.urlopen(req).read()

Как можно заставить скрипт по очереди использовать все IP адреса? Как самому на программном уровне выбирать через какой интерфейс выходить в интернет?

Это сообщение отредактировал(а) demoriz - 29.4.2009, 16:52
PM MAIL WWW ICQ Jabber   Вверх
spSerg
Дата 29.4.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.3.2007

Репутация: 4
Всего: 4



На сокетах делается просто:
Код

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.0.1', 50002)) #здесь выбираем интерфейс
s.connect(('192.168.0.2',7700))
s.send('asd')
s.close()

Надеюсь подскажет, куда копать.
PM   Вверх
spSerg
Дата 29.4.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.3.2007

Репутация: 4
Всего: 4



После небольших копаний нашел, как можно добраться к моменту подключения. Даю черновик, не более.
Нужно создать свой класс для обработки HTTP подключений таких как httplib.HTTPConnection
Код
class MyHTTPConnection(httplib.HTTPConnection):
    #не забудь о конструкторе :)
    
    #а этот метод придется скопировать и интегрировать в него код выбора интерфейса
    def connect(self):
        """Connect to the host and port specified in __init__."""
        msg = "getaddrinfo returns an empty list"
        for res in socket.getaddrinfo(self.host, self.port, 0,
                                      socket.SOCK_STREAM):
            af, socktype, proto, canonname, sa = res
            try:
                self.sock = socket.socket(af, socktype, proto)
                if self.debuglevel > 0:
                    print "connect: (%s, %s)" % (self.host, self.port)
                self.sock.connect(sa)
                # ### Сюда и добавим выбор нужного интерфейса
                # self.sock.bind(...)
                # ###
            except socket.error, msg:
                if self.debuglevel > 0:
                    print 'connect fail:', (self.host, self.port)
                if self.sock:
                    self.sock.close()
                self.sock = None
                continue
            break
        if not self.sock:
            raise socket.error, msg


переопределяем еще один класс-обработчик, которым заменим стандартный в цепочке
Код

class MyHTTPHandler(AbstractHTTPHandler):

    def http_open(self, req):
        return self.do_open(MyHTTPConnection, req)

    http_request = AbstractHTTPHandler.do_request_



#Создаем свой Opener со своим обработчиком, который заменит HTTPHandler:
Код
my_opener = urllib2.build_opener(MyHTTPHandler)

Подменяем основной Opener из urllib2
Код
urllib2.install_opener(my_opener)

Дальше пользуемся как обычно. и наслаждаемся.
Надеюсь, это поможет.
PM   Вверх
demoriz
Дата 29.4.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2008
Где: г. Псков

Репутация: нет
Всего: нет



Всё великолепно за исключением пару моментов   smile 
что за класс  AbstractHTTPHandler
и что обьявлять в конструкторе класса MyHTTPConnection

PM MAIL WWW ICQ Jabber   Вверх
spSerg
Дата 30.4.2009, 13:12 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.3.2007

Репутация: 4
Всего: 4



Как дети... 
А как я нашел это все?  smile 

Поиск по исходникам в стандартной библиотеке приводит к тому, что класс AbstractHTTPHandler находим внутри urllib2.
Значит, исправляем AbstractHTTPHandler на urllib2.AbstractHTTPHandler.

А если найти класс httplib.HTTPConnection, то обнаруживаем его конструктор:
Код

class HTTPConnection:
    #...тут некоторые инициализации
    def __init__(self, host, port=None, strict=None):
        #...это тоже нам не интересно. интересны только параметры для наследования.

Итого, в нашем классе будет такой конструктор:
Код

class MyHTTPConnection(httplib.HTTPConnection):
    def __init__(self, host, port=None, strict=None):
        httplib.HTTPConnection.__init__(self, host, port, strict)


Повторюсь еще раз - только в качестве черновика. (это не практический рабочий пример, а лишь его наброски)
PM   Вверх
demoriz
Дата 30.4.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2008
Где: г. Псков

Репутация: нет
Всего: нет



Сорри за глупость, только неделю как взялся python осваивать, и мне ещё сложно ориентироваться в модулях и библиотеках.
но проблема не решилась :(
Код

root [~]# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:127.0.0.1  P-t-P:127.0.0.1  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
          RX packets:67382 errors:0 dropped:0 overruns:0 frame:0
          TX packets:73879 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6758018 (6.4 MiB)  TX bytes:12516020 (11.9 MiB)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:77.221.155.141  P-t-P:77.221.155.141  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:1  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:77.221.155.142  P-t-P:77.221.155.142  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:2  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:77.221.159.146  P-t-P:77.221.159.146  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:3  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:77.221.159.148  P-t-P:77.221.159.148  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:4  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:77.221.159.149  P-t-P:77.221.159.149  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:5  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:77.221.159.150  P-t-P:77.221.159.150  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1


для примера сделал так:
Код

#!/usr/bin/python
# _*_ coding: utf-8 _*_

import urllib2
import httplib

def geturl():
        txheaders = {
            "User-Agent" : "Opera/9.64 (Windows NT 5.1; U; en) Presto/2.1.1",
            'Accept-Language': 'en-us',
            'Cache-Control': 'max-age=0'
        }
        req = urllib2.Request('http://xxxx.xx', None, txheaders)
        return urllib2.urlopen(req).read()

class MyHTTPConnection(httplib.HTTPConnection):
    def __init__(self, host, port=None, strict=None):
        httplib.HTTPConnection.__init__(self, host, port, strict)
    
    def connect(self):
        """Connect to the host and port specified in __init__."""
        msg = "getaddrinfo returns an empty list"
        for res in socket.getaddrinfo(self.host, self.port, 0,
                                      socket.SOCK_STREAM):
            af, socktype, proto, canonname, sa = res
            try:
                self.sock = socket.socket(af, socktype, proto)
                if self.debuglevel > 0:
                    print "connect: (%s, %s)" % (self.host, self.port)
                self.sock.connect(sa)
                self.sock.bind(('77.221.159.148', 80))
                
            except socket.error, msg:
                if self.debuglevel > 0:
                    print 'connect fail:', (self.host, self.port)
                if self.sock:
                    self.sock.close()
                self.sock = None
                continue
            break
        if not self.sock:
            raise socket.error, msg

class MyHTTPHandler(urllib2.AbstractHTTPHandler):
    def http_open(self, req):
        return self.do_open(MyHTTPConnection, req)
    http_request = urllib2.AbstractHTTPHandler.do_request_

my_opener = urllib2.build_opener(MyHTTPHandler)
urllib2.install_opener(my_opener)

print geturl()


в итоге апач сайта зарегестрировал коннект с 77.221.155.141
хотя стоит
self.sock.bind(('77.221.159.148', 80))
 smile 
PM MAIL WWW ICQ Jabber   Вверх
spSerg
Дата 30.4.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.3.2007

Репутация: 4
Всего: 4



Если ты можешь фиксировать коннекты апачем, то для начала стоит попробовать самый первый фрагмент с сокетами.
Он удобен тем, что его можно напрямую в интерпретаторе выполнять, и видеть, что получается.

PM   Вверх
demoriz
Дата 30.4.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2008
Где: г. Псков

Репутация: нет
Всего: нет



Код

#!/usr/bin/python
# _*_ coding: utf-8 _*_

import socket

host = '77.221.155.141'
port = 80

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.connect(("xxxx.xx", 80))

mes  = "GET / HTTP/1.1\r\n"
mes += "Host: www.ventra.su\r\n"
mes += "User-Agent: Opera/9.64 (Windows NT 5.1; U; en) Presto/2.1.1\r\n"
mes += "Accept: text/html\r\n"
mes += "Connection: close\r\n\r\n" 

s.send(mes)
buff = ""
result = ""
while 1:
    buff = s.recv(1024)
    if buff: result += buff
    else: break
s.close()

print result


ошибка
Код

Traceback (most recent call last):
  File "/srv/bot/bla.py", line 10, in <module>
    s.bind((host, port))
  File "<string>", line 1, in bind
socket.error: (98, 'Address already in use')


Добавлено через 10 минут и 31 секунду
Виноват, это просто апачь порт занимал
вышеописанный пример работает smile

Добавлено через 12 минут и 53 секунды
а возможно както сделать чтобы с апачем работало без конфликта?
PM MAIL WWW ICQ Jabber   Вверх
spSerg
Дата 30.4.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.3.2007

Репутация: 4
Всего: 4



Если обратил внимание и сравнил с рабочим последним семплом, то у меня в черновике ошибка.

Сначала нужно привязаться, а потом коннектиться. А не наоборот, как в черновике.  smile 
PM   Вверх
demoriz
Дата 1.5.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2008
Где: г. Псков

Репутация: нет
Всего: нет



ага заметил это 15 и 17 строки
спасибо запомощь, жаль плюсануть немогу
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0797 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.