Пытаюсь написать скриптик для управления оборудованием по телнету. Внезапно на php. Беда с cisco. Если в команде присутствует 0/0 (или 00, или 0.0), то соединение рвется.

Тестовый код:
$tn = new Telnet($host,»user»,»pass»);
$tn->connect();
$tn->sendCommand(‘sh interfaces gigabitEthernet 0/0.1’);
$tn->sendCommand(‘logout’);
echo $tn->readeddata;
$tn->close();

Вывод:
User Access Verification

Username: user
Password:
igate#sh interfaces gigabitEthernet 0/
0

Гугл в поиске не особенно помог. При этом пару раз оно почему-то сработало нормально, что совсем вгоняет меня в унынье. Может кто сталкивался?

Ах да, класс тут: http://pastebin.com/yysmkbjz

Tagged with →  

24 Responses to скрипт для управления оборудованием по телнету

  1. SkiNo:

    Для других команд все ок. Длинки тоже не жалуются.
    Циска c3845-advipservicesk9-mz.124-24.T4.bin, на 2960 с ноликами такая же грабля.

  2. RanPhone:

    socket_write возвращает значение
    шо там написано?

  3. SkiNo:

    int(37) возвращает.
    Длина команды как раз 36 + «n»

  4. SkiNo:

    У меня чуть другая команда была в тесте уже указана ) Соответственно для примера int(36)

  5. RanPhone:

    чудные дела
    а у циски логов, случайно, нет?

  6. SkiNo:

    В логах пусто, даже при уровне debugging.

  7. V-nSport:

    Stephan-V: когда у меня встала такая задача, правка скрипта из википедии решила вопрос за пять минут

  8. SkiNo:

    Stephan-V: Не стоит задача настроить циску из скрипта. Ну точнее expect скрипт и так есть.
    Ну и правка експекта, чтобы он взял значения из базы, нашел по стп маршрут нужный, законфигурил по пути все свитчи разных марок и заодно и циску эту злополучную не на 5 минут 😉
    Да и интерес поупражняться в кодинге, нежели конфиг автоматизировать.
    П.С.
    Похоже дело в проверке окончания вывода. При нуле empty($buffer) видимо таки true. Пойду проверять

  9. SkiNo:

    Оказывается циска медленная. Успевает читать по 1-2 символа. Соответственно 2 нуля считаются пустым буфером и все.
    Добавил usleep(100); в readUntil() все стало ок.

  10. AynMega:

    чем snmp не катит?

  11. SkiNo:

    Сложностью и человеконепонятностью для конфигуринья. Да и на чтение очень сильно от девайса к девайсу отличается.

  12. Gibno:

    хлебный_троллейбус.jpg

  13. SkiNo:

    поделишься простым примером?

  14. AynMega:

    есть некие стандартизованные мибы, которые обычно присутствуют везде.
    всякие админ статусы, порт оперейшен и етс

  15. SkiNo:

    Это не сильно упрощает задачу изменения конфигов на оборудовании. Ну разве что по снмп отправлять команду на слить конфиг на тфтп, там его править и по снмп же сказать залей обратно. Либо я чего-то сильно не понимаю, поэтому и попросил простой пример. Вдруг и правда все замечательно и удобно с снмп.

  16. Ekaon:

    ты правда что-то не понимаешь в snmp. С его помощью можно не только узнать статус девайса, но и настроить его.

  17. SkiNo:

    Да можно, можно. Только как-то сложно.
    Вот, например, как мне сделать вот это по снмп:
    conf t
    int Gi 0/0.111
    description test
    encapsulation dot1q 111
    ip address x.x.x.x y.y.y.y
    end

  18. Ekaon:

    snmpset -с commname string parametrs
    вопрос в нужной ветке.

  19. SkiNo:

    так в этом и сложность, что для каждой простой операции нужно искать набор оидов, которые могут сильно меняться от железки к железе. А некоторых вещей просто нет в снмп агенте.

  20. AynMega:

    эм. формирую файл с ацл
    вида

    int Port-channel10.715
    no ip access-group ACL out!
    ip access-list ext ACL
    permit ip host … any
    blabla

    int Port-channel10.715
    ip access-group DENY_MYTTK_OUT_TEST out!
    end»;

    начало скрипта
    my $acl_fname = «/tftpboot/ASR_BDR_STATIC/ACL_OUT»;
    open(fnh, «+>$acl_fname») || die(«can`t open or create file $acl_fname»);
    printf(fnh «$ACL_OUT»);
    close(fnh);

    $acl_fname = «ASR_BDR_STATIC/ACL_OUT»;
    send_snmp($acl_fname, $tftp_ip, «77.106.*.*», «community»);

    вот реализация..
    sub send_snmp
    {
    my $acl_fname = shift @_;
    my $tftp_ip = shift @_;
    my $gw_ip = shift @_;
    my $snmp_community = shift @_;
    #printf(«+++ send_snmp acl_fname=$acl_fname tftp_ip=$tftp_ip gw_ip=$gw_ip snmp_community=$snmp_community n»);

    my ($snmp_session, $snmp_error) = Net::SNMP->session( -hostname => $gw_ip, -port => 161, -version => 2, -community => $snmp_community, -timeout => 30, -retries => 0
    );

    unless (defined($snmp_session)) { die($snmp_error); }
    #printf(‘.1.3.6.1.4.1.9.2.1.53.’. $tftp_ip. » $acl_fnamen»);
    my $snmp_result = $snmp_session->set_request( -varbindlist => [ ‘.1.3.6.1.4.1.9.2.1.53.’. $tftp_ip, OCTET_STRING, $acl_fname ], );

    unless (defined($snmp_result)) {
    printf( «ERROR set_request: «. $snmp_session->error(). «n»);
    $snmp_session->close();
    #die( $snmp_session->error() );
    return 0;
    }

    #foreach (keys(%{$snmp_result})) {
    # printf(«snmp_result: $_ = ‘%s’n», $snmp_result->{$_});
    #}

    $snmp_session->close();

    #printf( $snmp_result->{$_});

    my $sres;

    foreach (keys(%{$snmp_result})) {
    $sres = «$_ = $snmp_result->{$_}»;
    printf («snmp_result: $sresn»);
    }

    printf («snmp_result: $sresn»);

    if ( $sres ne «.1.3.6.1.4.1.9.2.1.53.$tftp_ip = $acl_fname» )
    {
    printf(«ERROR: %sn», $sres);
    return 0;
    }

    printf(«SUCCESSn»);
    return 1;
    }

    саб делает copy tftp:blabla running. на цисках все единообразно.

  21. AynMega:

    вместо ip access–group DENY_MYTTK_OUT_TEST out!
    ip access–group ACL out конечно же

  22. SkiNo:

    Ну да. залить конфиг, слить конфиг. Это более менее быстро ищется для каждой железки. А если действительно конфигурить все по снмп, то пичаль и унынье какое-то. Поэтому и решил, что хорошо бы иметь таки телнет.

Добавить комментарий