Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re: regular expression matching in expect

by aitap (Deacon)
on Aug 06, 2012 at 18:30 UTC ( #985795=note: print w/replies, xml ) Need Help??

in reply to regular expression matching in expect

to match root@ ~#
Did you mean [root@hostname ~]#? Here is the regular expression to match it: qr/^\[root@\w*\s*~\]#/ (assuming that there can be a hostname after "@" and some kind of space character between the hostname and current directory).
Sorry if my advice was wrong.

Replies are listed 'Best First'.
Re^2: regular expression matching in expect
by cmastays (Initiate) on Aug 09, 2012 at 19:04 UTC
    That regular expression works fine. Thanks a lot.

    However i am facing a new issue now. After ssh, I can encounter either RSA key authentication and password prompt(First time) or only password prompt. Then I want to be able to continue to look for bash prompt so that I can continue my other linux commands.Here is my code snippet

    $exp->spawn("ssh -l root $sshHostname") or die "cannot spawn ssh: $!\n +"; $exp->expect($timeout,[ qr/RSA/i,#/ sub { my $fh = shift; $fh->send("yes\n"); }); $exp->expect($timeout,'-re','password' => sub { my $fh = shift; $fh->send("$sshPWD\n");} ); $exp->log_file->print("#Successfully ssh'ed in\n"); $exp->expect($timeout, '-re','~]#' => sub {my $fh = shift; $fh->send("cd /u0x/tmp\n");}
      If you're not too picky about remote host authentication...
      ssh -o 'StrictHostKeyChecking no' -o 'CheckHostIP no' $host
      See man ssh_config for more details. It can also be handy to use options to set the known_hosts file to /dev/null. Otherwise if you're picky it's probably best to manually ssh to all of your destination hosts once and accept the key manually and then failing if you get anything but login / password. It may be even handier to use the -l option to ssh to specify the login name so you don't have to try and match for the login case. Then you get down to the way my simple scripts of this type work: ssh as a specific user, ignore host key stuff, just wait for password and then the prompt... anything else is a die.
      Well, what error message do you receive? According to the documentation, near the New more Tcl/Expect-like interface of $object->expect(), you can return 'exp_continue' symbol from your callback sub to continue matching with next callback.
      Are you sure it won't be easier to use some SSH-related modules, for example, Net::SSH::Expect?
      Sorry if my advice was wrong.

        I did try using exp_continue; statement after every send but that didnt seem to help either.

        BTW. what advantage will Net::ssh offer that Use Expect doesnt?

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://985795]
[Lady_Aleena]: And the env variable $HOME doesn't work either. !@#$
[shmem]: no, that's a shell feature. Use $ENV{HOME}
[marioroy]: my $ans = qx{ find \$HOME -name "*.pl" -exec ls -l {} \\; };
[marioroy]: must backslash $ inside qx
[Lady_Aleena]: I haven't written perl for a while, I've been trying to do things at the command line. I'm having to relearn a lot.
[marioroy]: LA can you post the qx find again
[Lady_Aleena]: Things I would have written a script for while I was on Windows, I can run simply on the command line.
[Lady_Aleena]: marioroy, my @music_times = qx(find ~/Music/Albums/ -type f -iname '*.mp3' -exec mp3info -p "%S\n" {} \;); #unfixed

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (11)
As of 2017-04-23 21:07 GMT
Find Nodes?
    Voting Booth?
    I'm a fool:

    Results (432 votes). Check out past polls.