URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7644
[ Назад ]

Исходное сообщение
"Net::SSH"

Отправлено dist , 15-Окт-08 06:50 
Добрый день!
Народ помогите, в сложившейся проблеме.
Есть необходимость выполнять команду на удаленном сервере через ssh.
Для этой цели был поставлен Net::SSH (_НЕ_ Net::SSH::Perl, его, к сожалению, поставить не удалось).
В пакете есть функции:
sshopen2('user@hostname', $reader, $writer, $command);
sshopen3('user@hostname', $writer, $reader, $error, $command);

При использовании sshopen2 - все корректно работает, вот скрипт:  

#!/usr/bin/perl
use Net::SSH qw(sshopen2);
use strict;

  my $user = "smartfe";
  my $host = "192.192.192.9"; #этот хост существует
  my $cmd = "df -h";

  sshopen2("$user\@$host", *READER, *WRITER, "$cmd") || die "ssh: $!";

  while (<READER>) {
      chomp();
      print "$_\n";
  }

  close(READER);
  close(WRITER);

Однако, если возникла ошибка подключения - она валится в STDERR. Если использовать sshopen3 - то ошибку можно обработать при помощи $error и отправить в логи.
Но, если ошибки не возникает, так же нет никакого вывода команды df.
Я сделал вот так, но чувствую, что я не прав:

#!/usr/bin/perl
use Net::SSH qw(sshopen2 sshopen3);
use strict;

my $user = "smartfe";
my $host = "192.192.192.9";
my $cmd = "df -h -P| grep -v 'Filesystem'";

sshopen3("$user\@$host", *READER, *WRITER, *ERROR, "$cmd") || die "ssh: $!";


while (<READER>) {
        my @val=split(" ", $_);
        print $val[0].$val[1].$val[2].$val[3].$val[4].$val[5]."\n";
}

while(<ERROR>){
    print $_;
}
close(READER);
close(WRITER);
close(ERROR);

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


Содержание

Сообщения в этом обсуждении
"Net::SSH"
Отправлено dist , 15-Окт-08 11:01 
Решилась проблема...
Вот таким образом:
#!/usr/bin/perl
use Net::SSH qw(sshopen2 sshopen3);
use strict;

my $user = "smartfe";
my $host = "192.192.192.22";
my $cmd = "df -h -P| grep -v 'Filesystem'";

sshopen3("$user\@$host", *READER, *WRITER, *ERROR, "$cmd") || die "ssh: $!";

my $err=<ERROR>;

if($err){
    print "ERR\n";
    print $err."\n";

}else{
    while(<WRITER>){
        print $_;
    }
}

close(READER);
close(WRITER);
close(ERROR);
После этого все заработало. Надеюсь, кому-нибудь это поможет...


"Net::SSH"
Отправлено NuINu , 15-Окт-08 13:06 
>Решилась проблема...
>Вот таким образом:
>sshopen3("$user\@$host", *READER, *WRITER, *ERROR, "$cmd") || die "ssh: $!";

а где у вас авторизация? в упор не вижу. интересно.

можно было решить так:
sshopen2 "$user\@$host", *READER, *WRITER, $cmd || die "error conect ssh: $!\n";

if(<STDERR>) {
    print $_;
    print $_ until <STDERR>;
} else {
    while (<READER>) {
      chomp();
      print "$_\n";
    }
}



"Net::SSH"
Отправлено dist , 15-Окт-08 14:38 
>>Решилась проблема...
>>Вот таким образом:
>>sshopen3("$user\@$host", *READER, *WRITER, *ERROR, "$cmd") || die "ssh: $!";
>
>а где у вас авторизация? в упор не вижу. интересно.

а ее и нет. Авторизация по ключам.
Спасибо за вариант. :)



"Net::SSH"
Отправлено NuINu , 15-Окт-08 14:56 
>>>Решилась проблема...
>>>Вот таким образом:
>>>sshopen3("$user\@$host", *READER, *WRITER, *ERROR, "$cmd") || die "ssh: $!";
>>
>>а где у вас авторизация? в упор не вижу. интересно.
>
>а ее и нет. Авторизация по ключам.
>Спасибо за вариант. :)

не за что, он не работает, когда ошибка. я не правильно написал.


"Net::SSH"
Отправлено dist , 15-Окт-08 19:45 
>не за что, он не работает, когда ошибка. я не правильно написал.

Опыт - сын ошибок трудных :) Мой работает точно - проверено :)