http://www.perlmonks.org?node_id=1144160


in reply to Redirect expect screen output to file

Can you show a working script in code blocks? Also it would help to put the output in separate code blocks. See Writeup Formatting Tips.

  • Comment on Re: Redirect expect screen output to file

Replies are listed 'Best First'.
Re^2: Redirect expect screen output to file
by ryalagikar (Novice) on Oct 09, 2015 at 07:02 UTC

    Working Code

    #!/usr/bin/perl use strict; use warnings; use Getopt::Long qw(GetOptions); use Expect; use Net::OpenSSH; use Log::Log4perl qw(:easy); #Initializing the log file.. my $log_file = "/tmp/linux_cmd_execute_".$id.".log"; Log::Log4perl->easy_init( { level => $INFO, file => "> $log_file", } ); INFO( "expect usage user - $user host - $host , fuser - $fuser , cmd - $cmd "); my $start_time = time(); INFO("ssh to the host $host"); my $ssh = Net::OpenSSH->new("$user:$pswd\@$host"); if($ssh->error) { print "Unable to connect $host " . $ssh->error; exit; } my $expect; my ( $pty, $pid ) = $ssh->open2pty( { stderr_to_stdout => 1 }, "su +do su - $fuser" ) or die "Failed to attempt sudo su - $fuser"; $expect = Expect->init($pty); $expect->exp_internal(1); $expect->log_file("/tmp/expect.log", "w"); my $before; my $exit1; my $output; my $result = $expect->expect( undef, [ "\[\r\n]?\[^\r\n]+\[%#>\$] \$", sub { my $self = shift; INFO("Sending command $cmd"); $self->send("ls \r"); } ] ) or custom_error( "Expect Failed ",$id); $expect->hard_close(); exit 0;
    -----this output i need in a file------ Starting EXPECT pattern matching... at /usr/local/share/perl5/Expect.pm line 597 Expect::expect('Expect=GLOB(0x2b70d80)', undef, 'ARRAY(0x2b712 +18)') called at /products/backend/mopgenie/expect3.pl line 86 handle id(9): list of patterns: #1: -re `[\r\n]?[^\r\n]+[%#>$] $' handle id(9): Does `' match: pattern #1: -re `[\r\n]?[^\r\n]+[%#>$] $'? No. handle id(9): Does `\033]0;user@host:~\007\033[?1034h[user@host ~]$ ' match: pattern #1: -re `[\r\n]?[^\r\n]+[%#>$] $'? YES!! Before match string: `' Match string: `\033]0;user@host:~\007\033[?1034h[user@host ~]$ ' After match string: `' Matchlist: () Calling hook CODE(0x2b70cd8)... Sending 'ls1;date \r' to handle id(9) at /usr/local/share/perl5/Expect.pm line 1421 Expect::print('Expect=GLOB(0x2b70d80)', 'ls1;date \x{d}') call +ed at /products/backend/mopgenie/expect3.pl line 84 main::__ANON__('Expect=GLOB(0x2b70d80)') called at /usr/local/ +share/perl5/Expect.pm line 825 Expect::_multi_expect(undef, undef, 'ARRAY(0x1f52480)') called + at /usr/local/share/perl5/Expect.pm line 602 Expect::expect('Expect=GLOB(0x2b70d80)', undef, 'ARRAY(0x2b712 +18)') called at /products/backend/mopgenie/expect3.pl line 86 Starting EXPECT pattern matching... at /usr/local/share/perl5/Expect.pm line 597 Expect::expect('Expect=GLOB(0x2b70d80)', undef, 'ARRAY(0x2b72a +40)') called at /products/backend/mopgenie/expect3.pl line 122 handle id(9): list of patterns: #1: -re `[\r\n]?[^\r\n]+[%#>$] $'

      It looks like you are using two log files. Does either show anything?

      I've downloaded and am trying to execute the code. Can you please define ALL missing undefined vars (use bogus names if necessary to disguise sensitive data)?. Thanks.

      -Tom

      Update: Please also include your "custom_error" subroutine.

      Update2: I'm making a bit of progress, but I believe it would help more if you could describe plainly what you are trying to accomplish with your script. Using Expect is a last resort IMHO--to be used ONLY when human interaction is needed. There may be a better way to handle your problem. For one thing you might check out auditd.

        Hi,

        What i am trying to achieve using expect is, i have to fetch linux command(command may be simple linux command or shell script or perl script etc..) from database and execute the command based on the results have to perform some operations.

        code as below

        #!/usr/bin/perl use strict; use warnings; use Getopt::Long qw(GetOptions); use Expect; use Net::OpenSSH; my $user = ''; #linux login user name my $pswd = ''; # Password my $host = ''; #Host name or machine my $fuser = ''; #functional user or sudo user #Connect to host using OpenSSH my $ssh = Net::OpenSSH->new("$user:$pswd\@$host"); if($ssh->error) { print "Unable to connect $host " . $ssh->error; exit; } my $expect; #sudo su my ( $pty, $pid ) = $ssh->open2pty( { stderr_to_stdout => 1 }, "su +do su - $fuser" ) or die "Failed to attempt sudo su - $fuser"; $expect = Expect->init($pty); $expect->exp_internal(1); $expect->log_file("/tmp/expect.log", "w"); my $before; my $exit1; my $output; my $result = $expect->expect( undef, [ "\[\r\n]?\[^\r\n]+\[%#>\$] \$", sub { my $self = shift; $self->send("ls \r"); } ] ) or custom_error( "Expect Failed "); $expect->hard_close(); exit 0; sub custom_error { my $error = shift; print "Error : $error\n"; #some other operations exit 1; }

        need below output into a file

        Starting EXPECT pattern matching... at /usr/local/share/perl5/Expect.pm line 597 Expect::expect('Expect=GLOB(0x1b086f0)', undef, 'ARRAY(0x1ae5c +80)') called at ./expecct_demo.pl line 40 handle id(5): list of patterns: #1: -re `[\r\n]?[^\r\n]+[%#>$] $' handle id(5): Does `' match: pattern #1: -re `[\r\n]?[^\r\n]+[%#>$] $'? No. handle id(5): Does `\033]0;elkuser1@da3p-gen-imn-aut001:~\007\033[?103 +4h[elkuser1@da3p-gen-imn-aut001 ~]$ ' match: pattern #1: -re `[\r\n]?[^\r\n]+[%#>$] $'? YES!! Before match string: `' Match string: `\033]0;elkuser1@da3p-gen-imn-aut001:~\007\033[?1034 +h[elkuser1@da3p-gen-imn-aut001 ~]$ ' After match string: `' Matchlist: () Calling hook CODE(0x1aa89d0)... Sending 'ls \r' to handle id(5) at /usr/local/share/perl5/Expect.pm line 1421 Expect::print('Expect=GLOB(0x1b086f0)', 'ls \x{d}') called at +./expecct_demo.pl line 38 main::__ANON__('Expect=GLOB(0x1b086f0)') called at /usr/local/ +share/perl5/Expect.pm line 825 Expect::_multi_expect(undef, undef, 'ARRAY(0x1616c90)') called + at /usr/local/share/perl5/Expect.pm line 602 Expect::expect('Expect=GLOB(0x1b086f0)', undef, 'ARRAY(0x1ae5c +80)') called at ./expecct_demo.pl line 40

        I can redirect this output to file by running the script in back-end(&) mode. Is there any other way i can achieve this(any expect settings).

        Hi,

        'custom_error' subroutine does database update as 'failed' that's it.

        sub custom_error { my $error = shift; my $id = shift; my $end_time = time(); INFO("Error : $error"); INFO("Updating as failed"); # Updating table as failed.. exit 1; }