Как я могу ssh внутри сценария Perl? - PullRequest
10 голосов
/ 17 мая 2010

Я хочу подключиться к серверу по SSH и выполнить простую команду, такую ​​как «id», получить выходные данные и сохранить их в файле на моем основном сервере. У меня нет прав для установки Net :: SSH , что очень облегчило бы мою задачу. Пожалуйста, предоставьте мне решение для этого. Я попытался использовать back-ticks , но я не могу сохранить выходные данные на компьютере, с которого запускается мой скрипт.

Ответы [ 9 ]

14 голосов
/ 18 мая 2010

Лучший способ удаленного запуска команд с использованием SSH -

$ ssh user@host "command" > output.file

Вы можете использовать это либо в bash, либо в perl. Однако, если вы хотите использовать perl, вы можете установить модули perl в путь к локальному каталогу, как это было предложено Брайаном в его комментарии или из FAQ по Perl по адресу " Как мне сохранить мой собственный каталог module / library? " , Вместо использования Net :: SSH я бы предложил использовать Net :: SSH :: Perl в следующем примере.

#!/usr/bin/perl -w
use strict;
use lib qw("/path/to/module/");

use Net::SSH::Perl;

my $hostname = "hostname";
my $username = "username";
my $password = "password";

my $cmd = shift;

my $ssh = Net::SSH::Perl->new("$hostname", debug=>0);
$ssh->login("$username","$password");
my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd");
print $stdout;
8 голосов
/ 17 мая 2010

Вы всегда можете установить модули локально, и именно этот метод вы должны изучить;Тем не менее, вы должны иметь возможность сойти с рук

#!/usr/bin/perl

use strict;
use warnings;

my $id = qx/ssh remotehost id 2>&1/;

chomp $id;

print "id is [$id]\n"
2 голосов
/ 20 июня 2012

или, при условии наличия ключей хоста, и вы хотите что-то сделать с помощью команды ouput ...

open(SSH,"/usr/bin/ssh you\@server ps aux |") or die "$!\n";
while (<SSH>) { 
   # do stuff with $_ 
}
close SSH;
1 голос
/ 27 сентября 2014

У меня была похожая проблема, и после долгих поисков я нашел простой вариант. Я использовал qx() и запускал команды ssh, как обычно. Подвох в том, что мне пришлось захватывать как stderr, так и stdout.

Ниже приведен пример того, что я использовал:

my $output = qx(ssh root\@$curIP python -V 2>&1);

Запускает команду python -V, которая выводит информацию о версии в stderr. В этом примере мой IP-адрес был сохранен в переменной $curIP. Наконец, 2>&1 помогает захватывать как stdout, так и stderr. Я не указал пароль, так как у меня есть настройка обмена ключами. Надеюсь, это поможет.

1 голос
/ 08 сентября 2010

Если вы используете обратные ссылки, попробуйте это:

my @output = `ssh root@1.1.1.1 "which perl"`;

print "output: @output";

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

0 голосов
/ 12 октября 2016

Я знаю, что это очень старая тема, но так как я столкнулся с той же проблемой, я нашел другое полезное решение в случае, если кто-то использует Linux.

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $host = $ARGV[0];
my $port = $ARGV[1];
my $cmd = $ARGV[2];

my @output = readpipe( "ssh -p ".
               $port." ".
               $host." ".
               $cmd."" );

chomp @output;

print Dumper \@output;

__END__

perl sample.pl 127.0.0.1 22 "which perl"
Ubuntu 16.04.1 LTS
$VAR1 = [
          '/usr/bin/perl'
        ];

Предполагается, что вы настроили ssh-ключи, поэтому ввод пользователя не требуется. Я не хотел иметь жестко закодированные значения, это лучший способ для меня, который работал лучше всего. Я использую readpipe для достижения этого.

Надеюсь, это поможет найти решение в случае несложного кодирования.

0 голосов
/ 27 октября 2012
use warnings;
use strict;
use NET::SSH2;

sub is_sshalive;

my $host = "ip"; # use the ip host to connect
my $user = "UNAME"; # your account
my $pass = "PASSWD"; # your password
my $cmd;
my $ssh2 = Net::SSH2->new();
$ssh2->debug(1);
if ($ssh2->connect($host)) {
    #if ($ssh2->auth_password($user,$pass)) {
    if ($ssh2->auth_keyboard($user,$pass)) {
        print "\n Executing command...\n";
        $cmd = "ls";
        print " ==> Running $cmd\n";
        if(is_sshalive($ssh2) == 1) {
                print "\nSSH connection died";
                exit 1;
        } else {
            run_testsuite($cmd, $ssh2);
        }
    } else {
        warn "ssh auth failed.\n";
        exit 1;
    }
} else {
    warn "Unable to connect Host $host \n";
    exit 1;
}
print "test passed done 0\n";


sub run_testsuite {
    my $cmd = $_[0];
    my $ssh2 = $_[1];

    my $chan2 = $ssh2->channel();
    $chan2->shell();
    print $chan2 "$cmd \n";
    print "LINE : $_" while <$chan2>;
    $chan2->close;
    return 0;
}

sub is_sshalive {
    my $ssh2 = $_[0];
    if ($ssh2->poll(1000) == 0) {
        return 0; # passed
    } else {
        return 1; #failed
    }
}
0 голосов
/ 17 мая 2010

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

Если вы можете настроить ssh-ключи, просто используйте уже опубликованную команду backticks, хотя вам может потребоваться опция -i

#!/usr/bin/perl
use warnings;
use strict;
use Expect;
use Data::Dumper;

my $user = 'user';
my $pw = 'password';
my $host = 'host';
my $cmd = 'id';

my $exp = new Expect;
$exp->log_file("SSHLOGFILE.txt");
$exp->log_stdout(0);
$exp->raw_pty(1);


my $cli = "/usr/bin/ssh $user\@$host -o StrictHostKeyChecking=no -q $cmd";

$exp->spawn($cli) or die "Cannot spawn $cli: $!\n";

$exp->expect(5,
 [ qr /ssword:*/ => sub { my $exph = shift;
                          $exph->send("$pw\n");
                          exp_continue; }] );

my $read = $exp->exp_before();
chomp $read;
print Dumper($read);

$exp->soft_close();
0 голосов
/ 17 мая 2010

Если у вас настроены ключи хоста ssh, вы можете просто запустить системную команду ssh и затем указать команду для запуска на компьютере после этого. Например:

`ssh user@remoteserver.domain.com id`

Вы должны быть в состоянии сжать / сохранить этот вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...