При обслуживании парка машин под управлением операционной системы Windows, немаловажным является возможность быстрого и максимально простого подключения к удаленному рабочему столу. Нередка ситуация, когда подключаться нужно не только с рабочего места, но и находясь удаленно за многие километры от него. Желательно, чтобы местоположение определялось автоматически и, в зависимости от этого, применялись индивидуальные настройки. Для упрощения этой процедуры, был написан небольшой скрипт.

Подключение к удаленному рабочему столу сводится к простому вводу ‘./rdp username’. Имя пользователя можно вводить в любом регистре, пароль и хост удаленной машины автоматически подставляются из простого текстового файла. Скрипт работает из под Mac OS X (OS X) и из под Linux. Для OS X должен быть установлен X Window System (X11). Интерфейс сетевого подключения и внутренний IP адрес так же автоматически определяются в зависимости от операционной системы.

Для примера, подключение к серверу:
./rdp root

Процедура подключения:

Подключение происходит по SSH протоколу через промежуточный Linux сервер (без X-сервера, конечно) в корпоративной локальной сети, на нем запускается rdesktop и отрисовка интерфейса перенаправляется на наш компьютер (X11Forwarding). Трафик шифруется и неплохо сжимается. К тому же, это позволяет подключиться практически из любого места, включая открытые точки доступа, особенно если ssh-server повесить на 443 порт, как правило, его не закрывают на открытых точках и не режут метод CONNECT. Linux сервер с OpenSSH, думаю, можно заменить Windows сервером с установленным FreeSSHD, к примеру, но для этого придется поменять процедуру подключения, сделав форвадинг портов и запуская rdesktop-клиент локально, этот вариант мне неинтересен, при необходимости любой сможет самостоятельно поправить скрипт. Можно обойтись и без промежуточного сервера, конечно, об этом ниже.

Код скрипта:
rdp:
#!/bin/bash

# ----------------------------------------------
# RDP & RDP over SSH automatic connection script
# Written by ZeroChaos
# Version 1.0, 2012-08-04
# Site: https://zerolab.net/
# ----------------------------------------------

# My location
DIR=$(dirname "$0")

# Determine the OS
OSTYPE=`uname`
if [ "$OSTYPE" = "Darwin" ]; then
# Network interface
NETINT_MAC="en0 en1 en2 en3"
for NETINT in `echo $NETINT_MAC`; do
IFACE=`ifconfig $NETINT 2>/dev/null | grep -q 'inet ' && echo $NETINT`
if [ "$IFACE" != "" ]; then
MYNETINT="$IFACE"
fi
done
# Get IP
MYIP=`ifconfig $MYNETINT | grep 'inet ' | awk '{ print $2 }'`
elif [ "$OSTYPE" = "Linux" ]; then
# Network interface
NETINT_LINUX="eth0 eth1 eth2 eth3"
for NETINT in `echo $NETINT_LINUX`; do
IFACE=`ifconfig $NETINT 2>/dev/null | grep -q 'inet addr' && echo $NETINT`
if [ "$IFACE" != "" ]; then
MYNETINT="$IFACE"
fi
done
# Get IP
MYIP=`ifconfig $MYNETINT | grep 'inet addr' | awk '{ print $2 }' | awk -F: '{ print $2 }'`
else
OSTYPEERR="1"
echo "---------------------------------------------------"
echo " Unable to determine the type of operating system! "
echo "---------------------------------------------------"
fi

if [ "$OSTYPEERR" != "1" ]; then
# Work or Home?
# IP's variables
source $DIR/var/ip.txt
if [ "$MYIP" = "$WORK" ]; then
MYDIR="$DIR/var/work"
elif [ "$MYIP" = "$HOME" ]; then
MYDIR="$DIR/var/home"
else
echo "----------------------------------------"
echo " Error when comparing the IP addresses! "
echo "----------------------------------------"
fi

# Other variables
source $MYDIR/host.txt
source $DIR/var/dc.txt
source $MYDIR/resolution.txt
USERNAME=`echo $1 | tr '[:upper:]' '[:lower:]'`

# RDP connection to the host
while read LINE; do
IFS=";"
set -- $LINE
USER="$1"
PASSWORD="$2"
IP="$3"
TRUSER=`echo $1 | tr '[:upper:]' '[:lower:]'`
if [ "$USERNAME" = "$TRUSER" ]; then
source $DIR/var/command.txt
fi
done < $DIR/var/list.txt fi

Сохраните содержимое в файл 'rdp' и дайте права на выполнение:
chmod 755 rdp

Создайте каталог 'var' рядом со скриптом и положите в него файлы 'command.txt', 'dc.txt', 'ip.txt' и 'list.txt'. Формат файлов представлен ниже.

Подключение к удаленному рабочему столу:
command.txt:
ssh -YC $HOST rdesktop -u $USER -d $DC -p $PASSWORD -k en-us -r clipboard:CLIPBOARD $IP -g $RESOLUTION

Наш контроллер домена:
dc.txt:
DC="corp.zerolab.net"

Рабочий и домашний IP адреса:
ip.txt:
WORK="192.168.0.5"
HOME="192.168.1.4"

Список пользователей, паролей и хостов с разделителем в виде ';':
list.txt:
root;password1;192.168.0.4
User1;password2;192.168.0.6
User2;password3;192.168.0.7
User3;password4;192.168.0.8
User4;password5;192.168.0.9
User5;password6;192.168.0.10
User145;password146;192.168.0.150
# [do not delete this string]

В каталоге 'var' создаем еще 2 каталога: 'home' и 'work'. В них создаем файлы 'host.txt' и 'resolution.txt'. Их содержимое:

Настройки для домашнего компьютера:
home/host.txt:
HOST="zerochaos@local.zerolab.net"

home/resolution.txt:
RESOLUTION="1236x755"

Настройки для рабочего компьютера:
work/host.txt:
HOST="zerochaos@192.168.0.1"

work/resolution.txt:
RESOLUTION="1632x1005"

Структура каталога со скриптом:

Для SSH авторизации советую воспользоваться беспарольным вариантом, т.е. авторизацией по ключу. Для этого сгенерируйте пару public/private rsa key и передайте public key на удаленный сервер, выступающий у нас в роли шлюза. На промежуточном сервере не забудьте установить rdesktop.

sudo apt-get install rdesktop

Этот скрипт можно использовать и без промежуточного Linux/Windows сервера и протокола SSH, соответственно, при том, что Вы подключаетесь с рабочего места в своей локальной сети или через VPN-туннель. Если Вы работаете под операционной системой Linux, просто измените команду в 'command.txt', убрав в начале 'ssh -YC $HOST'. Приятной и продуктивной Вам работы.

Добавлено: 08.08.2011

Скрипт немного доработан, теперь пользователь выбирается из списка. Если это кому-то покажется более удобным чем предыдущий вариант, пользуйтесь. Список автоматически строится все из того же текстового файла 'list.txt'.

Вызов скрипта:
./rdp

Код скрипта:
rdp:
#!/bin/bash

# ----------------------------------------------
# RDP & RDP over SSH automatic connection script
# Written by ZeroChaos
# Version 1.1, 2012-08-08
# Site: https://zerolab.net/
# ----------------------------------------------

# My location
DIR=$(dirname "$0")

# Determine the OS
OSTYPE=`uname`
if [ "$OSTYPE" = "Darwin" ]; then
# Network interface
NETINT_MAC="en0 en1 en2 en3"
for NETINT in `echo $NETINT_MAC`; do
IFACE=`ifconfig $NETINT 2>/dev/null | grep -q 'inet ' && echo $NETINT`
if [ "$IFACE" != "" ]; then
MYNETINT="$IFACE"
fi
done
# Get IP
MYIP=`ifconfig $MYNETINT | grep 'inet ' | awk '{ print $2 }'`
elif [ "$OSTYPE" = "Linux" ]; then
# Network interface
NETINT_LINUX="eth0 eth1 eth2 eth3"
for NETINT in `echo $NETINT_LINUX`; do
IFACE=`ifconfig $NETINT 2>/dev/null | grep -q 'inet addr' && echo $NETINT`
if [ "$IFACE" != "" ]; then
MYNETINT="$IFACE"
fi
done
# Get IP
MYIP=`ifconfig $MYNETINT | grep 'inet addr' | awk '{ print $2 }' | awk -F: '{ print $2 }'`
else
OSTYPEERR="1"
echo "---------------------------------------------------"
echo " Unable to determine the type of operating system! "
echo "---------------------------------------------------"
fi

if [ "$OSTYPEERR" != "1" ]; then
# Work or Home?
# IP's variables
source $DIR/var/ip.txt
if [ "$MYIP" = "$WORK" ]; then
MYDIR="$DIR/var/work"
elif [ "$MYIP" = "$HOME" ]; then
MYDIR="$DIR/var/home"
else
echo "----------------------------------------"
echo " Error when comparing the IP addresses! "
echo "----------------------------------------"
fi

# Other variables
source $MYDIR/host.txt
source $DIR/var/dc.txt
source $MYDIR/resolution.txt

# Function for user choice
PS3='Выберите пользователя: '
userchoice() {
eval set $USERARR
select USER; do
USERNAME=$USER
break
done
}

# Read the list of users
while read LINE; do
IFS=";"
set -- $LINE
USERARR="$USERARR $1"
done < $DIR/var/list.txt # User choice userchoice $USERARR # RDP connection to the host USERLINE=`grep "$USERNAME" < $DIR/var/list.txt` IFS=";" set -- $USERLINE USER="$1" PASSWORD="$2" IP="$3" echo "Пользователь: $USER" echo "IP: $IP" source $DIR/var/command.txt fi