#!/usr/bin/perl -w use strict; use Getopt::Long; my $sshcommand ; my $sshconfigfilename ; my $netcatcommand ; my $netcatoptions ; my $machine ; my $result = GetOptions ( "config=s" => \$sshconfigfilename, "machine=s" => \$machine, "help" => \&help, "sshcommand=s" => \$sshcommand, "netcatcommand=s" => \$netcatcommand, "netcatoptions=s" => \$netcatoptions, ); $sshconfigfilename = "$ENV{HOME}/.ssh/config" unless defined($sshconfigfilename); $machine = $ENV{GRID_REMOTE_MACHINE} unless defined($machine); parseSSHConfig(); $sshcommand = 'ssh' unless defined($sshcommand); $netcatcommand = 'netcat' unless defined($netcatcommand); $netcatoptions = '-v -l -p 1234' unless defined($netcatoptions); help() unless defined($machine); my $command = "$sshcommand $machine $netcatcommand $netcatoptions"; print "Connected to '$machine' via '$sshcommand' using '$netcatcommand' with options '$netcatoptions'\n"; exec($command); sub parseSSHConfig { local $/ = undef; open(my $con, $sshconfigfilename); my $c = <$con>; close($con); $c =~ /^\s*(Host.*$machine(?:.|\n)*?)(?:Host\b|\z)/m; my $hostdesc = $1; if (defined($hostdesc)) { $sshcommand = $1 if !$sshcommand and !$hostdesc =~ /^#gm\s+sshcommand\s+'([^'\n]*)'/m; $netcatcommand = $1 if !$netcatcommand and $hostdesc =~ /^#gm\s+netcat(?:command)?\s+'([^'\n]*)'/m; $netcatoptions = $1 if !$netcatoptions and $hostdesc =~ /^#gm\s+netcatopt(?:ions)?\s+'([^'\n]*)'/m; $machine = $1 if $hostdesc =~ /^\s*HostName\s+([\w.-]+)/m; } } sub help { print <<"INFO"; Usage: $0 [--sshcommand 'ssh'] [--netcatcommand 'netcat'] [--netcatoptions netcatoptions] [--config configfile] [--machine machine] By default, machine is given by environment variable \$GRID_REMOTE_MACHINE By default, sshcommand is 'ssh' By default, netcatcommand is 'netcat' By default, netcatoptions is '-v -l -p 1234' By default, configfile is '~/.ssh/config' Algorithm: The program connects via 'ssh' to machine 'machine' and executes there the 'netcat' command in 'listen' mode using the 'port' specified by the 'netcatoptions'. INFO exit(0); }