Добрый день!
Народ помогите, в сложившейся проблеме.
Есть необходимость выполнять команду на удаленном сервере через 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.
На этом форуме тоже ничего найти не удалось.
Помогите решить проблему.
Заранее спасибо.
Решилась проблема...
Вот таким образом:
#!/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);
После этого все заработало. Надеюсь, кому-нибудь это поможет...
>Решилась проблема...
>Вот таким образом:
>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";
}
}
>>Решилась проблема...
>>Вот таким образом:
>>sshopen3("$user\@$host", *READER, *WRITER, *ERROR, "$cmd") || die "ssh: $!";
>
>а где у вас авторизация? в упор не вижу. интересно.а ее и нет. Авторизация по ключам.
Спасибо за вариант. :)
>>>Решилась проблема...
>>>Вот таким образом:
>>>sshopen3("$user\@$host", *READER, *WRITER, *ERROR, "$cmd") || die "ssh: $!";
>>
>>а где у вас авторизация? в упор не вижу. интересно.
>
>а ее и нет. Авторизация по ключам.
>Спасибо за вариант. :)не за что, он не работает, когда ошибка. я не правильно написал.
>не за что, он не работает, когда ошибка. я не правильно написал.Опыт - сын ошибок трудных :) Мой работает точно - проверено :)