Использование scp в сети к которой нет прямого доступа.

Mar 08, 2009 01:04

Возникла необходимость довольно часто гонять файлы из сети к которой нет прямого доступа, но есть пограничный шлюз под моим управление с ssh. Сделал bash обертку к scp. Назвал его scprn - scp remote network. Делает она довольно банальную вещь, обеспечивает ключ: -G gateway.

Т.е. для копирования с удаленного или на удаленный сервер, я могу использовать полный синтаксис scp, добавив ключик создающий ssh туннель до моего шлюза в виде:
-G username@servername

Example:

scprn -G username@gatewayipaddress username@serverinremotenetwork:~/myfilename.tar.gz .

#!/bin/bash

NO_ARGS=0
E_OPTERROR=1

usage () {
        echo "Error $E_OPTERROR: Please usage: `basename $0` [-G GATEWAY]"
        exit $1
}

if [ $# -eq "$NO_ARGS" ]; then
        usage $E_OPTERROR
fi

while getopts ":G:" option
do
        case $option in
        G)
                GATEWAY="$OPTARG";
        ;;
        esac
done

parse_cmd () {
        while [ ! -z $1 ]
        do
                HOST="$1"
                if echo $1 | grep -q \@; then
                        TO=`echo $1 | sed -e "s/\:.\{1,\}$//"`;
                        USERNAME=`echo $TO |sed -e "s/\@.\{1,\}//"`;
                        IP=`echo $TO |sed -e "s/^.\{1,\}\@//"`;
                        FILE=`echo $1 | sed -e "s/.\{1,\}\://"`
                        break;
                fi
                shift;
        done
}

CMD=`echo $@| sed -e "s/\-G[[:space:]]\{1,\}$GATEWAY//g"`

parse_cmd $CMD

CMD=`echo $CMD |awk '{ while($i) {
                        i++;
                        if ($i == "'$HOST'")
                                $i="'$USERNAME@localhost:$FILE'";
                        print $i;}  }'`

echo Making tunnel to remote network.
echo Connecting to $GATEWAY.

ssh $GATEWAY -L 22222:$IP:22 -f -N

echo Connecting to $USERNAME@$IP and get file $FILE

scp -P 22222 $CMD

pkill -HUP -n ssh
Previous post Next post
Up