LINUX.ORG.RU

perl ssh2 в 1 сессию


0

0

Подскажите по скрипту..
# perl -c /root/Desktop/show.pl
Bareword "SSH2_MSG_CHANNEL_OPEN_CONFIRMATION" not allowed while "strict subs" in use at /root/Desktop/show.pl line 34.
Bareword "SSH2_MSG_CHANNEL_REQUEST" not allowed while "strict subs" in use at /root/Desktop/show.pl line 37.
/root/Desktop/show.pl had compilation errors.

#!/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);
}
anonymous

Bareword "SSH2_MSG_CHANNEL_OPEN_CONFIRMATION" not allowed while "strict subs" in use at /root/Desktop/show.pl line 34. Bareword "SSH2_MSG_CHANNEL_REQUEST" not allowed while "strict subs" in use at /root/Desktop/show.pl line 37.

Перевожу: указанные константы не объявлены.

anonymous
()
Ответ на: комментарий от kranky

> А если убрать use strict?

Извиняюсь за грубость, но не знаешь Perl -- не позорься. Я уже всё описал в первом посте. Для тех кто не верит:

----------8<----------8<----------8<---------- $ cat f.pl #!/usr/bin/perl

use warnings; use strict;

print UNDEF_CONST;

$ perl f.pl Name "main::UNDEF_CONST" used only once: possible typo at f.pl line 6. print() on unopened filehandle UNDEF_CONST at f.pl line 6. ----------8<----------8<----------8<---------- $ cat g.pl #!/usr/bin/perl

use warnings; use strict;

use constant SOME_CONST => 42;

print SOME_CONST;

$ perl g.pl 42 ----------8<----------8<----------8<----------

Всем срочно читать документацию чтобы выяснить, как в Perl реализованы константы (подсказка: как процедуры) и что такое bareword.

anonymous
()
Ответ на: комментарий от kranky

> А если убрать use strict?

Извиняюсь за грубость, но не знаешь Perl -- не позорься.  Я уже всё
описал в первом посте.  Для тех кто не верит:

----------8<----------8<----------8<----------
$ cat f.pl
#!/usr/bin/perl

use warnings;
use strict;

print UNDEF_CONST;

$ perl f.pl
Name "main::UNDEF_CONST" used only once: possible typo at f.pl line 6.
print() on unopened filehandle UNDEF_CONST at f.pl line 6.
----------8<----------8<----------8<----------
$ cat g.pl
#!/usr/bin/perl

use warnings;
use strict;

use constant SOME_CONST => 42;

print SOME_CONST;

$ perl g.pl
42
----------8<----------8<----------8<----------

Всем срочно читать документацию чтобы выяснить, как в Perl реализованы
константы (подсказка: как процедуры) и что такое bareword.

anonymous
()
Ответ на: комментарий от anonymous

#!/usr/bin/perl

use warnings;
use strict;

print 1 + UNDEF_CONST;

$ perl f.pl
Bareword "UNDEF_CONST" not allowed while "strict subs" in use at f.pl line 6.
Execution of f.pl aborted due to compilation errors.

anonymous
()

Добавь

use Net::SSH::Perl::SSH2;

в начало

anonymous
()
Ответ на: комментарий от kranky

->А если убрать use strict?
А вот это к стати помоголо=)
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 я так и не увидел.
К стати, как в sub сделать несколько команд? Т.е. тут уже придется в начале соформировать несколько пакетов, а потом их отправить?
Почему у меня вывода uname -a нет?

Еще вроде можно через pty => 1 (слать в один канал все), но у меня так не получается почему-то.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.