JohnDoe
JohnDoe

Reputation: 163

Perl expect output of executed command

i wrote a little script which executes the ls command. Now I want to store the output of that command in a variable to work with it in the further perl script. Unfortunately I cannot grab the output from the ls command.

my ($core) = "servername";
    my $tel_con = "ssh ".$core. " -l $user";

    $ssh = Expect->spawn("$tel_con");
    $ssh->log_stdout(1);

    unless ( $ssh->expect( 5, -re => '$' ) ) {
            return "Never connected " . $ssh->exp_error() . "\n";
    }
    sleep 1;
    $ssh->send_slow(0, "ls -l\r");
    $ssh->clear_accum();
    my $str = $ssh->exp_after();
    print "STR = '$str'\n";

Maybe you can give me some help please?

Upvotes: 2

Views: 7409

Answers (6)

Thorsten Niehues
Thorsten Niehues

Reputation: 14432

In case you can not or don't want to use Net::OpenSSH you may do:

my @output = $exp->expect(5);
print 'OUT: '.$output[3].'END';

To get the whole output (including the used command, return string, console information)

Upvotes: 1

PinkElephantsOnParade
PinkElephantsOnParade

Reputation: 6592

Layman's terms?

I must obligatorily post this link - I still go there from time-to-time, it is the most layman-y explanation I've ever found of all things regex:

http://www.anaesthetist.com/mnm/perl/Findex.htm

Upvotes: 0

salva
salva

Reputation: 10234

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($core, user => $user);
$ssh->error and die $ssh->error;

my $output = $ssh->capture('ls -l');

print "command output:\n$output\n\n";

Upvotes: 1

jtv4k
jtv4k

Reputation: 224

It seems that Expect will redirect everything to STDOUT and log it internally. Since you enabled output with $ssh->log_stdout(1), you should be able to get the results of ls -l directly from STDOUT (maybe by redirecting standard out to a variable). You can also see try grab the data from the internal logging. Just make sure to grab the output before doing clear_accum().

From CPAN: $object->send_slow($delay, @strings);

... After each character $object will be checked to determine whether or not it has any new data ready and if so update the accumulator for future expect() calls and print the output to STDOUT and @listen_group if log_stdout and log_group are appropriately set.

Upvotes: 0

Katerberg
Katerberg

Reputation: 121

What is send_slow? Depending on how this command sends the ls command, the output can be received in different ways.

Most probably, the error output of the command is stored in the $? variable, possibly byte-shifted.

Upvotes: 0

Hachi
Hachi

Reputation: 3289

you could call expect in a seperate process and grab the output via qx or open a pipe

Upvotes: 0

Related Questions