pratikmonu has asked for the wisdom of the Perl Monks concerning the following question:

Hi All,

I am trying to create a perl script which would perform a system call to the zsh with install command.

Installation is happening through db_silent_install, but between execution of this System Call, there is an User Intervention required:-

Completed installing Database Software ###################################################################### +########## Open a terminal as root and invoke /scratch/pratranj/oracle/product/11.2.0/dbhome_1/root.sh ... then press enter to continue. ###################################################################### +##########

Is there a way to handle this using perl?

I tried using fork, but even in the subprocess, it is looking for Enter command to proceed further.

Please suggest.

Regards,
PR

2017-09-05 Athanasius added code and paragraph tags

Replies are listed 'Best First'.
Re: Input Enter while Execution of a process
by hippo (Archbishop) on Sep 04, 2017 at 11:12 UTC

    Did you try simply piping echo?

    system ("echo | zsh foo.sh");

    I would rather do this than head off down the Expect rabbit hole if it is all that's required.

      I think the problem of the OP is that they (only) want to take additional actions when the other script asks for input, maybe warranting something like IPC::Run3 or Expect.

      But without further information, this is pure speculation on my part.

Re: Input Enter while Execution of a process
by roboticus (Chancellor) on Sep 04, 2017 at 13:49 UTC

    partikmonu:

    I'd first check out a few things:

    • Does the root.sh script do very much? If it doesn't, you could just do the steps in your perl script and ignore the root.sh script.
    • Is the root.sh script under your control? If so, you could just edit *that* script to not require a keypress.
    • Perhaps the root.sh script can do the install automatically if there's an environment variable or command line setting for it.
    • Perhaps the root.sh script is executing a different program that requires the keyboard entry. If so, *that* program may have an option that you could use.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

Re: Input Enter while Execution of a process
by Corion (Patriarch) on Sep 04, 2017 at 11:07 UTC

    Can you show us a short, self-contained example that reproduces your problem? It doesn't have to do anything except sleep and print, but I think it would help us understand your situation.

    Please also include the relevant code that you tried and tell us where and how it fails.

      Hi, I am trying to run the Following as a part of my perl Script

      system "/bin/zsh", "$HOME/env/$ENV{DEST_SCRIPT_HOST}/db_silent_install/11gR2-11.2.0.1.0/install.zsh";

      when this Command is Executed, the install.zsh creates DB, and It prompts in the shell to run the mentioned Command as root user, and then Press enter,

      I want to write this system command in such a way that it executes the install.zsh and once the process is paused, it should hit Enter to move the process Ahead

      Thanks PR

        Aah, OK - that helps me understand your problem better.

        Basically you want to monitor the output of the installation script, and if it asks for input (or asks to run some commands as root), you want to do that from your Perl script and then tell the other script to continue.

        First I would look if that installation script itself can invoke or prepend another command (like sudo ...) in front of the needed root commands instead for automated installation.

        If there is no such facility, you can either redirect the output of install.zsh to a file and monitor the file or use IPC::Run3 or Expect to communicate with the installation script.

        Personally, I would try the following approach, launching install.zsh in the background having it write to a file but keeping the input to it open:

        use File::Tail; my $logfile = '/tmp/install.zsh.log'; my $child = open my $install_zsh, "| /bin/zsh $HOME/env/$ENV{DEST_SCRI +PT_HOST}/db_silent_install/11gR2-11.2.0.1.0/install.zsh >$logfile"; # Sleep to give the logfile time to fill sleep 5; my $timeout = time + 60; my $log = File::Tail->new($logfile); while (defined($line=$log->read)) { print "$line"; if( $line =~ /root user/ ) { print "Running magic helper commands as root\n"; system("sudo ...") == 0 or die "$?"; print "Sending ENTER to install script\n"; print $child "\n"; }; }

        Update: s/\$file/\$log/, spotted by johngg