Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> perl ssh2 
:(
    Опции темы
Loki
Дата 4.7.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



подскажите как в перле создать однопотоковое соединение ssh2, т.е. мне нужно передать вот такое занчение, видел кучу примеров, но все как-то много там написано. подскажите как кароче всего?
Можно ли это начение в options или type как-нибуть засунуть?
SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
PM MAIL   Вверх
nitr
Дата 4.7.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Не вкурил...
Код

->new(option => ...);

Посмотрите документацию. там практически всегда есть описание конструктора.

P.s.: Вы бы подробнее объяснялись и желательно без ошибок, возможно вам бы уже ответили ;)


--------------------
PM   Вверх
Loki
Дата 8.7.2008, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну например у меня вот так вот не пашет, т.е. как будто опять выполняетяс в еще одном потоке, а мне нежно в том же...
Код

my $ssh = new Net::SSH::W32Perl (
            $host, 
            protocol => 2,
    port => 22,
    match => '/yes/',
    debug    => 1 );
 my $pack = Net::SSH::Perl::Packet->new($ssh, type => SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
 my $buffer = $ssh->packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
 pack->send;

можно заюзать функцию, например...
Код

$ssh->register_handler(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION,
sub{
   my($channel, $buffer) = @_;
    });
 Send a packet to an ssh daemon.
    my $pack = Net::SSH::Perl::Packet->new($ssh, type => SSH_MSG_NONE);
    $pack->send;
my $channel = $ssh->login('testowiy', 'test');
_session_channel;
    $channel->open;
    $channel->register_handler(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION,
 sub {
        my($channel, $packet) = @_;
        $channel->{ssh}->debug("Sending command: $cmd");
        my $r_packet = $channel->request_start("exec", 0);
        $r_packet->put_str($cmd);
        $r_packet->send;
        if ($stdin) {
            $channel->send_data($stdin);
            $channel->drain_outgoing;
            $channel->{istate} = CHAN_INPUT_WAIT_DRAIN;
            $channel->send_eof;
            $channel->{istate} = CHAN_INPUT_CLOSED;
       }
  });

но это длинно, к тому же это только чать, еще нужна channel, etc... 
Как сделать максимально коротко отправку  команд в том же потоке по ssh2, в ssh1 такой проблемы нет.
PM MAIL   Вверх
Loki
Дата 15.7.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



такой скрипт
Код

use strict;
use Net::SSH::Perl;
use Net::SSH::Perl::Cipher;
my $port = "ssh";
my $host ="xxx.xx.x.x";
my $user = "xxxxxxxxx";
my $pass = "xxxxxx";
my $cmd = "show version";
my $ssh = Net::SSH::Perl->new($host,debug => 1);
$ssh-&gtlogin($user, $pass);
my($out, $err) = $ssh->cmd($cmd);

ругается при коннекте вот так...
Channel open failure: 1: reason 4:

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


Бывалый
*


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

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



от части заборол, вот что  что получилось...
Код

#!/usr/bin/perl
#use strict;
use Net::SSH::Perl;
use Net::SSH::Perl::Cipher;
my $port = "ssh";
my $host ="192.168.16.108";
my $user = "user";
my $pass = 'qwerty';
my $cmd = 'uname -a';
my $ssh = Net::SSH::Perl->new($host,protocol => 2,port => 22,debug => 1);
$ssh->login($user, $pass);
sub cmd {
    my $ssh = shift;
    my($cmd, $stdin) = @_;
    my $cmgr = $ssh->channel_mgr;
    my $channel = $ssh->_session_channel;
    $channel->open;

    $channel->register_handler(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, sub {
        my($channel, $packet) = @_;
        $channel->{ssh}->debug("Sending command: $cmd");
        my $r_packet = $channel->request_start("exec", 0);
        $r_packet->put_str($cmd);
        $r_packet->send;

    #    if ($stdin) {
    #        $channel->send_data($stdin);
    #        $channel->drain_outgoing;
    #        $channel->{istate} = CHAN_INPUT_WAIT_DRAIN;
    #        $channel->send_eof;
    #        $channel->{istate} = CHAN_INPUT_CLOSED;
    #    }
    });

    my($exit);
    $channel->register_handler(SSH2_MSG_CHANNEL_REQUEST,
        _make_input_channel_req(\$exit));

    my $h = $ssh->{client_handlers};
    my($stdout, $stderr);
    if (my $r = $h->{stdout}) {
        $channel->register_handler("_output_buffer",
            $r->{code}, @{ $r->{extra} });
    }
    else {
        $channel->register_handler("_output_buffer", sub {
            $stdout .= $_[1]->bytes;
        });
    }
    if (my $r = $h->{stderr}) {
        $channel->register_handler("_extended_buffer",
            $r->{code}, @{ $r->{extra} });
    }
    else {
        $channel->register_handler("_extended_buffer", sub {
            $stderr .= $_[1]->bytes;
        });
    }

    $ssh->debug("Entering interactive session.");
    $ssh->client_loop;

    ($stdout, $stderr, $exit);
}


Код

legolas: Reading configuration data /root/.ssh/config
legolas: Reading configuration data /etc/ssh_config
legolas: Allocated local port 1023.
legolas: Connecting to 192.168.10.10, port 22.
legolas: Remote version string: SSH-2.0-OpenSSH_4.3p2 Debian-9etch2
legolas: Remote protocol version 2.0, remote software version OpenSSH_4.3p2 Debian-9etch2
legolas: Net::SSH::Perl Version 1.30, protocol version 2.0.
legolas: No compat match: OpenSSH_4.3p2 Debian-9etch2.
legolas: Connection established.
legolas: Sent key-exchange init (KEXINIT), wait response.
legolas: Algorithms, c->s: 3des-cbc hmac-sha1 none
legolas: Algorithms, s->c: 3des-cbc hmac-sha1 none
legolas: Entering Diffie-Hellman Group 1 key exchange.
legolas: Sent DH public key, waiting for reply.
legolas: Received host key, type 'ssh-dss'.
legolas: Host '192.168.10.10' is known and matches the host key.
legolas: Computing shared secret key.
legolas: Verifying server signature.
legolas: Waiting for NEWKEYS message.
legolas: Enabling incoming encryption/MAC/compression.
legolas: Send NEWKEYS, enable outgoing encryption/MAC/compression.
legolas: Sending request for user-authentication service.
legolas: Service accepted: ssh-userauth.
legolas: Trying empty user-authentication request.
legolas: Authentication methods that can continue: publickey,password.
legolas: Next method to try is publickey.
legolas: Next method to try is password.
legolas: Trying password authentication.
legolas: Login completed, opening dummy shell channel.
legolas: channel 0: new [client-session]
legolas: Requesting channel_open for channel 0.
legolas: channel 0: open confirm rwindow 0 rmax 32768
legolas: Got channel open confirmation, requesting shell.
legolas: Requesting service shell on channel 0.


Только вывод uname -a я так и не увидел. Почему у меня вывода uname -a нет?

К стати, как в sub сделать несколько команд? 
Т.е. тут уже придется в начале соформировать несколько пакетов, а потом их отправить?
Если по простому, то вот так...
Код

                $ssh->cmd('sudo');
                $ssh->cmd("$root_pass");

а в моем случае как? smile 


PM MAIL   Вверх
Loki
Дата 24.7.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброе время суток.
У меня вот такая проблемка. Я хочу выполнить нескольео команд на нескольки роутерых, для этого перебираю их по списку. Вот что у меня 
получается когда сеанс с первым благополучно завершается...
Net::SSH: Can't bind socket to port 1023: Адрес уже используется at ./ro.pl line 194
вот такая 194 строка, собственно $host это есть один из списка ИП-адрес роутера.

Код

my $ssh = Net::SSH::Perl->new($host);
        $ssh->login($id, $pass);
        #$ssh->shell; #<< вот эта строчка работает, попадаю в шел юзера
        if ($enable||$opts->{'e'}) {
                $ssh->cmd('/bin/su'); # << вот ту так можно? похоже что в этом месте затык, ибо в логе про суид ниче нет.
                $ssh->cmd("$enable"); 
        }


Как открывать новую сессию с нового сорусного порта или может у меня еще первая не завершается?
на сервере вот что в логе...
Код

Jul 24 09:29:15 debian useradd[20678]: new user: name=proba, UID=509, GID=0, home=/home/proba, shell=/bin/sh
Jul 24 09:29:27 debian passwd[20679]: (pam_unix) password changed for proba
Jul 24 09:29:27 debian passwd[20679]: (pam_unix) Password for proba was changed
Jul 24 09:30:09 debian sshd[20680]: Accepted password for proba from 192.168.10.12 port 1023 ssh2
Jul 24 09:30:09 debian sshd[20688]: (pam_unix) session opened for user proba by (uid=0)
Jul 24 09:30:09 debian sshd[20688]: (pam_unix) session closed for user proba



PM MAIL   Вверх
ginnie
Дата 28.7.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый Loki, похоже, что предыдущее соединение не закрывается. Вы удаляете объект Net::SSH::Perl?
При установлении соединения Net::SSH::Perl последовательно перебирает локальные порты для обнаружения свободного. Т.к. выводится сообщение о невозможности использовать порт 1023, значит предыдущее соединение не было закрыто.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Loki
Дата 7.8.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ginnie @ 28.7.2008,  19:03)
Уважаемый Loki, похоже, что предыдущее соединение не закрывается. Вы удаляете объект Net::SSH::Perl?
При установлении соединения Net::SSH::Perl последовательно перебирает локальные порты для обнаружения свободного. Т.к. выводится сообщение о невозможности использовать порт 1023, значит предыдущее соединение не было закрыто.

С этим у меня все получилось запустив скрип не от рута.
Вот только проблемс вот такой...
Код

Requesting service shell on channel 0.
channel 1: new [client-session]
Requesting channel_open for channel 1.
Entering interactive session.
Channel open failure: 1: reason 4:

а если посылать несколько команд в цикле, то такие строчки на каждую следующую команду.
Requesting channel_open for channel 2.
Entering interactive session.
Channel open failure: 2: reason 4:
Requesting channel_open for channel 3.
Entering interactive session.
Channel open failure: 3: reason 4:
итд....

Это сообщение отредактировал(а) Loki - 7.8.2008, 16:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




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


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

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