Возникла необходимость довольно часто гонять файлы из сети к которой нет прямого доступа, но есть пограничный шлюз под моим управление с 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