#!/usr/bin/perl use strict; use warnings; use IPC::Open3; use Symbol; my $input = ''; my $_env = { 'SCRIPT_NAME' => '', 'SERVER_NAME' => 'my.site.example.com', 'HTTP_REFERER' => 'https://myother.site.example.com/', 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate', 'PATH_INFO' => '/index.cgi', 'HTTP_CONNECTION' => 'Keep-Alive', 'REQUEST_METHOD' => 'GET', 'HTTP_ACCEPT' => '*/*', 'HTTP_UA_CPU' => 'x86', 'SERVER_SOFTWARE' => 'Apache', 'REMOTE_USER' => 'mylogonid', 'AUTH_TYPE' => 'Basic', 'HTTP_CLIENT_IP' => '112.113.114.115', 'HTTP_USER_AGENT' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322; MS-RTC LM 8)', 'QUERY_STRING' => '', 'SERVER_PORT' => '443', 'HTTP_COOKIE' => '', 'HTTP_ACCEPT_LANGUAGE' => 'en-us', 'REMOTE_ADDR' => '123.124.125.126', 'SERVER_PROTOCOL' => 'HTTP/1.1', 'GATEWAY_INTERFACE' => 'CGI/1.1', 'HTTP_HOST' => 'my.site.example.com', 'PATH_TRANSLATED' => '/content/my.site.example.com/proxy.cgi/index.cgi' }; # save the calling applications environment my $env_snapshot = { %ENV }; # merge a CGI-style environment foreach my $key (keys(%{$_env})) { if (!exists($ENV{$key})) { $ENV{$key} = $_env->{$key}; } } #my $cmd = '/home2/servicing' . ($ENV{'PATH_INFO'} || '/index.cgi'); my $cmd = '/tmp/testprog.sh'; my $dir = `dirname $cmd`; chomp $dir; # If PROG_STDERR isn't initialized then open3 treats it as a false # value and sends STDERR to STDOUT. Dumb default behavior; I'm using open3 # because I want to capture that output! my $PROG_STDERR = gensym(); print "Executing $cmd\n"; my $pid = open3(my $PROG_STDIN, my $PROG_STDOUT, $PROG_STDERR, 'cd ' . $dir . ' && ' . $cmd) or die $@; print "PROG_STDIN: $PROG_STDIN, tell(PROG_STDIN): " . tell($PROG_STDIN) . "\n"; if ($input) { print $PROG_STDIN $input or die "Error sending data to STDIN: $!"; } close($PROG_STDIN); waitpid $pid, 0; print "PROG_STDOUT: $PROG_STDOUT, tell(PROG_STDOUT): " . tell($PROG_STDOUT) . "\n"; my $output = join('', <$PROG_STDOUT>) or die "Error reading data from STDOUT: $!"; close($PROG_STDOUT); print "output: $output\n"; print "PROG_STDERR: $PROG_STDERR, tell(PROG_STDERR): " . tell($PROG_STDERR) . "\n"; my $error = join('', <$PROG_STDERR>) or die "Error reading data from STDERR: $!"; close($PROG_STDERR); print "error: $error\n"; # restore our environment %ENV = %{ $env_snapshot };