In order to connect to the servers at work we need to connect through a stepping stone host (via SSH). Since some of the servers are MS Windows machines which can be managed via the Remote Desktop Protocol (RDP), this traffic needs to be tunneled over SSH as well.
I wrote the following bash script to automate setting up the tunnel. It sets some default variables and then looks for an available port between 1234 and 1254 (chosen completely arbitrarily) and uses it for the tunnel. Then it uses the rdesktop program to start the RDP connection.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | #!/bin/bash # # This script makes an ssh tunnel to a stepping stone server # and uses it to start an rdesktop connection to the machine # given as the first argument of the script. # # (C) L.C. Karssen # $Id: winremote.sh,v 1.14 2010/02/10 13:03:08 lennart Exp $ # # User-configurable variables ssh_username=your_steppingstone_username_here steppingstone=steppingstone.your_company.com rdesktop_username=your_windows_username_here rdesktop_domain=your_windows_domain_here rdesktop_opts="-z -g 1024x768 -a 16" rdesktop_port=3389 # This is the standard MS rdesktop port # For ordinary users it should not be necessary to change anything below this line. # Some functions: usage() { cat <<EOF Usage: $program [options] rdesktop_hostname Make a remote desktop connection through an SSH tunnel. Options: -h, --help print this help message -s, --steppingstone steppingstone_hostname set other stepping stone host (default: $steppingstone) -t, --timeout sec set timeout (default: 1) -v, --verbose verbose output --version print version Note that some customisations need to be made in the first few lines of this script (e.g. user names and other defaults) EOF } program=`basename $0` # Command line option parsing. Shift all options verbose= timeout=1 while [ $# -gt 0 ] do case $1 in -v | --verbose | -d | --debug ) verbose=true ;; --version ) echo '$Revision: 1.14 $' exit 0 ;; -t | --timeout ) shift timeout="$1" if [ $timeout -lt 1 ]; then timeout=1 fi if [ $verbose ]; then echo "Timeout set to $timeout" fi ;; -s | --steppingstone ) shift steppingstone="$1" if [ $verbose ]; then echo "Steppingstone server is $steppingstone" fi ;; -h | --help ) usage exit 0 ;; -*) echo "$0: invalid option $1" >&2 usage exit 1 ;; *) break ;; esac shift done # Server name (as seen on the steppingstone) that we want to connect to: rdesktop_server=$1 ################### Config done, let's get to work ######################## # Simple usage description if [ "$rdesktop_server" == "" ]; then echo "Error: No rdesktop host given" >&2 usage exit 1 fi # Find a free port on the local machine that we can use to connect through min_port=1234 max_port=1254 used_ports=(`netstat -tan | awk '{print $4}' | grep 127.0.0.1 | awk -F: '{print $2}' | sort -g`) if [ $verbose ]; then echo "Used ports are: ${used_ports[@]}" fi # In the next line we first print the $used_ports as an array, but with # each port on a single line. This is then piped to an awk script that # puts all the values in an array and subsequently walks through all ports # from $min_port to $max_port in order to find the first port that is not # in the array. This port is printed. local_port=`printf "%i\n" ${used_ports[@]} | \ awk -v minp=$min_port -v maxp=$max_port \ '{ array[$1]=1 } END { for (i=minp; i<=maxp; i++) { if (i in array) continue; else { print i; break } } }'` if [ "$local_port" == "" ]; then echo "Error: No ports free! Exiting..." >&2 exit 2 fi if [ $verbose ]; then echo "Selected port was: $local_port" fi # Create tunnel: if [ $verbose ]; then echo "Creating SSH tunnel..." fi ssh_opts="-f -N -L" ssh $ssh_opts $local_port:$rdesktop_server:$rdesktop_port \ $ssh_username@$steppingstone # Allow the ssh tunnel to be established sleep $timeout # Abort if tunnel has not been established pidof_ssh=`pgrep -f "ssh $ssh_opts $local_port"` if [ "$pidof_ssh" == "" ]; then echo "Error: Timeout while establishing tunnel" >&2 echo "Exiting..." exit 3 fi # Make rdesktop connection if [ $verbose ]; then echo "Opening Remote desktop connection to $rdesktop_server..." fi rdesktop $rdesktop_opts -u $rdesktop_username -p - \ -d $rdesktop_domain localhost:$local_port # Clean up tunnel if [ $verbose ]; then echo "Cleaning up SSH tunnel with pid $pidof_ssh and local port $local_port" fi kill $pidof_ssh |
It’s helpful. Thanks for the work.
Is there an example where I want to run Word, Excel and Power Point files in a sequence and close each one and then start them back in a loop. I need to remote desktop to a remote server to accomplish this, appreciate your help if u can provide me a script for the same.
I am not a scripting guru
Hi Prasad,
Looking at the command line options of rdesktop there doesn’t seem to be way to tell the remote machine to start a certain program after connecting. Maybe you could try to write a script (a batch file or something in Powershell) that runs when you login (maybe in the Startup folder in your Start menu) and opens the MS Office files for you.
Good luck!