/usr/bin/env GATEWAY_INTERFACE='CGI/1.1' REQUEST_METHOD='GET' PATH_INFO='/extra/path/elements' QUERY_STRING='name1=value1&name2=value2' /srv/www/cgi-bin/some.cgi #### #!/bin/bash export GATEWAY_INTERFACE='CGI/1.1' export REQUEST_METHOD='GET' export PATH_INFO='/extra/path/elements' export QUERY_STRING='name1=value1&name2=value2' exec /srv/www/cgi-bin/some.cgi #### #!/usr/bin/perl # called as wrapper.pl name1 arg1 name2 arg2 ... use strict; use warnings; sub encode { my $value=shift; $value=~s/([^A-Za-z0-9._-])/sprintf('%%%02X',ord $1)/ge; return $value; } $ENV{'GATEWAY_INTERFACE'}='CGI/1.1'; $ENV{'REQUEST_METHOD'}='GET'; $ENV{'PATH_INFO'}='/extra/path/elements'; my @pairs; while (@ARGV) { my $name=encode(shift @ARGV); my $value=encode(shift @ARGV); push @pairs,"$name=$value"; } $ENV{'QUERY_STRING'}=join('&',@pairs); exec('/srv/www/cgi-bin/some.cgi') or die "exec failed: $!";