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).
|