#!/bin/sh ##************************************************************** ## ## Copyright (C) 1990-2017, Condor Team, Computer Sciences Department, ## University of Wisconsin-Madison, WI. ## ## Licensed under the Apache License, Version 2.0 (the "License"); you ## may not use this file except in compliance with the License. You may ## obtain a copy of the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ## See the License for the specific language governing permissions and ## limitations under the License. ## ##************************************************************** # condor_ssh wrapper # format of contact file is # node hostname port cwd username # This script assumes the existance of a contact file # and uses it to map a hostname into # the correct hostname/port of a listening sshd # Uncomment the following line to have the shell print out # each command to stderr before running it, useful for # debugging #set -x if [ $# -lt 2 ] then echo "Usage: condor_ssh hostname command arg1 arg2" fi doneParsing=false while [ $doneParsing = "false" ] do doneParsing=true if [ "$1" = "-x" ] then shift hasx="-x" doneParsing="false" fi if [ "$1" = "-l" ] then shift shift doneParsing="false" fi if [ "$1" = "-n" ] then shift hasn="-n" doneParsing="false" fi done proc=$1 shift # The option can also appear _after_ the host doneParsing=false while [ $doneParsing = "false" ] do doneParsing=true if [ "$1" = "-x" ] then shift hasx="-x" doneParsing="false" fi if [ "$1" = "-l" ] then shift shift doneParsing="false" fi if [ "$1" = "-n" ] then shift hasn="-n" doneParsing="false" fi done # The HTCondor environment variables aren't always passed, # but this script should always execute from the scratch dir if [ -z ${_CONDOR_SCRATCH_DIR+x} ] then _CONDOR_SCRATCH_DIR=`/bin/pwd` fi contact=$_CONDOR_SCRATCH_DIR/contact if [ ! -f $contact ] then echo "error: contact file $contact can't be found" exit 1 fi # Note that the spaces in the grep are significant line=`grep "^$proc " $contact` if [ $? -ne 0 ] then echo Proc $proc is not in contact file $contact exit 1 fi #proc=`echo $line | awk '{print $1}'` host=`echo $line | awk '{print $2}'` port=`echo $line | awk '{print $3}'` username=`echo $line | awk '{print $4}'` dir=`echo $line | awk '{print $5}'` key=$_CONDOR_SCRATCH_DIR/tmp/$proc.key # Open MPI/MPICH assumes that you always have a shared filesystem, and # sticks the pwd in front of all relative executable pathnames # This is no good. # So, if any argument contains the pwd, replace it with the scratch dir ssh_args=$@ p=`/bin/pwd` ssh_args=`echo $ssh_args | sed s@${p}@${dir}@g` # Now call ssh with the remaining arguments at the end. # Set the working directory and $HOME to the scratch dir # so that the worker processes look there for the user's executable. /usr/bin/ssh -q $hasn -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -i $key -l $username -p $port $host cd "$dir" \; export HOME="$dir" \; "$ssh_args"