Hex Artifact Content

Artifact a814622ace41e08ed7a9c2f21225f59e56d3e4f8:


0000: 23 21 20 2f 62 69 6e 2f 62 61 73 68 0a 0a 69 66  #! /bin/bash..if
0010: 20 5b 20 22 24 31 22 20 3d 20 27 2d 73 73 68 27   [ "$1" = '-ssh'
0020: 20 5d 3b 20 74 68 65 6e 0a 09 73 68 69 66 74 0a   ]; then..shift.
0030: 0a 09 52 44 50 5f 53 53 48 5f 4a 55 4d 50 42 4f  ..RDP_SSH_JUMPBO
0040: 58 3d 22 24 31 22 0a 09 73 68 69 66 74 0a 65 6c  X="$1"..shift.el
0050: 73 65 0a 09 52 44 50 5f 53 53 48 5f 4a 55 4d 50  se..RDP_SSH_JUMP
0060: 42 4f 58 3d 27 27 0a 66 69 0a 0a 52 44 50 5f 48  BOX=''.fi..RDP_H
0070: 4f 53 54 3d 22 24 31 22 0a 73 68 69 66 74 0a 0a  OST="$1".shift..
0080: 66 75 6e 63 74 69 6f 6e 20 70 72 69 6e 74 48 65  function printHe
0090: 6c 70 28 29 20 7b 0a 09 65 63 68 6f 20 27 55 73  lp() {..echo 'Us
00a0: 61 67 65 3a 20 72 64 70 20 5b 2d 73 73 68 20 68  age: rdp [-ssh h
00b0: 6f 73 74 5d 20 3c 68 6f 73 74 3e 20 5b 3c 78 66  ost] <host> [<xf
00c0: 72 65 65 52 64 70 41 72 67 73 2e 2e 2e 3e 5d 27  reeRdpArgs...>]'
00d0: 0a 7d 0a 0a 69 66 20 5b 20 2d 7a 20 22 24 7b 52  .}..if [ -z "${R
00e0: 44 50 5f 48 4f 53 54 7d 22 20 5d 3b 20 74 68 65  DP_HOST}" ]; the
00f0: 6e 0a 09 70 72 69 6e 74 48 65 6c 70 20 3e 26 32  n..printHelp >&2
0100: 0a 0a 09 65 78 69 74 20 31 0a 66 69 0a 0a 23 20  ...exit 1.fi..# 
0110: 49 6e 63 6c 75 64 65 20 61 20 63 6f 6e 66 69 67  Include a config
0120: 20 66 69 6c 65 2c 20 77 68 69 63 68 20 69 73 20   file, which is 
0130: 61 63 74 75 61 6c 6c 79 20 6a 75 73 74 20 61 20  actually just a 
0140: 73 63 72 69 70 74 0a 23 20 54 68 69 73 20 73 63  script.# This sc
0150: 72 69 70 74 20 63 61 6e 20 64 6f 20 74 68 69 6e  ript can do thin
0160: 67 73 20 6c 69 6b 65 20 75 70 64 61 74 65 20 74  gs like update t
0170: 68 65 20 22 52 44 50 5f 53 53 48 5f 4a 55 4d 50  he "RDP_SSH_JUMP
0180: 42 4f 58 22 0a 23 20 62 61 73 65 64 20 6f 6e 20  BOX".# based on 
0190: 74 68 65 20 22 52 44 50 5f 48 4f 53 54 22 2c 20  the "RDP_HOST", 
01a0: 70 72 6f 76 69 64 65 20 61 20 70 61 73 73 77 6f  provide a passwo
01b0: 72 64 20 28 66 72 6f 6d 20 61 20 70 61 73 73 77  rd (from a passw
01c0: 6f 72 64 0a 23 20 6d 61 6e 61 67 65 72 2c 20 6c  ord.# manager, l
01d0: 69 6b 65 20 68 75 6e 74 65 72 32 2c 20 69 64 65  ike hunter2, ide
01e0: 61 6c 6c 79 29 2c 20 65 74 63 2e 0a 69 66 20 5b  ally), etc..if [
01f0: 20 2d 66 20 7e 2f 2e 72 64 70 2e 63 6f 6e 66 20   -f ~/.rdp.conf 
0200: 5d 3b 20 74 68 65 6e 0a 09 2e 20 7e 2f 2e 72 64  ]; then... ~/.rd
0210: 70 2e 63 6f 6e 66 0a 66 69 0a 0a 23 23 20 53 70  p.conf.fi..## Sp
0220: 6c 69 74 20 74 68 65 20 74 61 72 67 65 74 20 69  lit the target i
0230: 6e 74 6f 20 68 6f 73 74 2f 70 6f 72 74 20 70 61  nto host/port pa
0240: 69 72 73 0a 63 61 73 65 20 22 24 7b 52 44 50 5f  irs.case "${RDP_
0250: 48 4f 53 54 7d 22 20 69 6e 0a 09 2a 3a 2a 29 0a  HOST}" in..*:*).
0260: 09 09 68 6f 73 74 4e 61 6d 65 3d 22 24 28 65 63  ..hostName="$(ec
0270: 68 6f 20 22 24 7b 52 44 50 5f 48 4f 53 54 7d 22  ho "${RDP_HOST}"
0280: 20 7c 20 63 75 74 20 2d 66 20 31 20 2d 64 20 27   | cut -f 1 -d '
0290: 3a 27 29 22 0a 09 09 68 6f 73 74 50 6f 72 74 3d  :')"...hostPort=
02a0: 22 24 28 65 63 68 6f 20 22 24 7b 52 44 50 5f 48  "$(echo "${RDP_H
02b0: 4f 53 54 7d 22 20 7c 20 63 75 74 20 2d 66 20 32  OST}" | cut -f 2
02c0: 20 2d 64 20 27 3a 27 29 22 0a 09 09 3b 3b 0a 09   -d ':')"...;;..
02d0: 2a 29 0a 09 09 68 6f 73 74 4e 61 6d 65 3d 22 24  *)...hostName="$
02e0: 7b 52 44 50 5f 48 4f 53 54 7d 22 0a 09 09 68 6f  {RDP_HOST}"...ho
02f0: 73 74 50 6f 72 74 3d 27 33 33 38 39 27 0a 09 09  stPort='3389'...
0300: 3b 3b 0a 65 73 61 63 0a 0a 23 20 49 66 20 77 65  ;;.esac..# If we
0310: 20 61 72 65 20 6a 75 6d 70 69 6e 67 20 74 68 72   are jumping thr
0320: 6f 75 67 68 20 61 6e 20 53 53 48 20 6a 75 6d 70  ough an SSH jump
0330: 62 6f 78 2c 20 73 65 74 75 70 20 70 6f 72 74 20  box, setup port 
0340: 66 6f 72 77 61 72 64 69 6e 67 0a 69 66 20 5b 20  forwarding.if [ 
0350: 2d 6e 20 22 24 7b 52 44 50 5f 53 53 48 5f 4a 55  -n "${RDP_SSH_JU
0360: 4d 50 42 4f 58 7d 22 20 5d 3b 20 74 68 65 6e 0a  MPBOX}" ]; then.
0370: 09 23 20 50 69 63 6b 20 61 20 72 61 6e 64 6f 6d  .# Pick a random
0380: 20 70 6f 72 74 20 74 6f 20 66 6f 72 77 61 72 64   port to forward
0390: 20 6f 6e 0a 09 72 61 6e 64 6f 6d 50 6f 72 74 3d   on..randomPort=
03a0: 24 5b 24 7b 52 41 4e 44 4f 4d 7d 20 25 20 31 30  $[${RANDOM} % 10
03b0: 32 34 20 2b 20 33 33 39 30 5d 0a 0a 09 23 20 44  24 + 3390]...# D
03c0: 65 74 65 72 6d 69 6e 65 20 61 6e 20 53 53 48 20  etermine an SSH 
03d0: 63 6f 6e 74 72 6f 6c 20 73 6f 63 6b 65 74 0a 09  control socket..
03e0: 73 73 68 43 6f 6e 74 72 6f 6c 53 6f 63 6b 65 74  sshControlSocket
03f0: 3d 22 2f 74 6d 70 2f 73 73 68 2d 73 6f 63 6b 2d  ="/tmp/ssh-sock-
0400: 24 7b 72 61 6e 64 6f 6d 50 6f 72 74 7d 2d 24 24  ${randomPort}-$$
0410: 24 7b 52 41 4e 44 4f 4d 7d 24 7b 52 41 4e 44 4f  ${RANDOM}${RANDO
0420: 4d 7d 24 7b 52 41 4e 44 4f 4d 7d 22 0a 0a 09 66  M}${RANDOM}"...f
0430: 75 6e 63 74 69 6f 6e 20 63 6c 65 61 6e 75 70 28  unction cleanup(
0440: 29 20 7b 0a 09 09 23 20 4b 69 6c 6c 20 74 68 65  ) {...# Kill the
0450: 20 53 53 48 20 73 65 73 73 69 6f 6e 0a 09 09 73   SSH session...s
0460: 73 68 50 69 64 3d 22 24 28 74 69 6d 65 6f 75 74  shPid="$(timeout
0470: 20 33 30 20 73 73 68 20 2d 53 20 22 24 7b 73 73   30 ssh -S "${ss
0480: 68 43 6f 6e 74 72 6f 6c 53 6f 63 6b 65 74 7d 22  hControlSocket}"
0490: 20 2d 4f 20 63 68 65 63 6b 20 2f 64 65 76 2f 6e   -O check /dev/n
04a0: 75 6c 6c 20 32 3e 26 31 20 7c 20 67 72 65 70 20  ull 2>&1 | grep 
04b0: 27 70 69 64 3d 27 20 7c 20 73 65 64 20 27 73 40  'pid=' | sed 's@
04c0: 2e 2a 70 69 64 3d 40 40 3b 73 40 29 2e 2a 24 40  .*pid=@@;s@).*$@
04d0: 40 27 29 22 0a 09 09 69 66 20 5b 20 2d 6e 20 22  @')"...if [ -n "
04e0: 24 7b 73 73 68 50 69 64 7d 22 20 5d 3b 20 74 68  ${sshPid}" ]; th
04f0: 65 6e 0a 09 09 09 6b 69 6c 6c 20 2d 39 20 22 24  en....kill -9 "$
0500: 7b 73 73 68 50 69 64 7d 22 20 3e 2f 64 65 76 2f  {sshPid}" >/dev/
0510: 6e 75 6c 6c 20 32 3e 2f 64 65 76 2f 6e 75 6c 6c  null 2>/dev/null
0520: 0a 09 09 66 69 0a 0a 09 09 72 6d 20 2d 66 20 22  ...fi....rm -f "
0530: 24 7b 73 73 68 43 6f 6e 74 72 6f 6c 53 6f 63 6b  ${sshControlSock
0540: 65 74 7d 22 0a 09 7d 0a 0a 09 23 20 53 74 61 72  et}"..}...# Star
0550: 74 20 53 53 48 0a 09 73 73 68 20 2d 4c 24 7b 72  t SSH..ssh -L${r
0560: 61 6e 64 6f 6d 50 6f 72 74 7d 3a 24 7b 68 6f 73  andomPort}:${hos
0570: 74 4e 61 6d 65 7d 3a 24 7b 68 6f 73 74 50 6f 72  tName}:${hostPor
0580: 74 7d 20 2d 6f 20 45 78 69 74 4f 6e 46 6f 72 77  t} -o ExitOnForw
0590: 61 72 64 46 61 69 6c 75 72 65 3d 79 65 73 20 2d  ardFailure=yes -
05a0: 6f 20 43 6f 6e 74 72 6f 6c 4d 61 73 74 65 72 3d  o ControlMaster=
05b0: 79 65 73 20 2d 53 20 22 24 7b 73 73 68 43 6f 6e  yes -S "${sshCon
05c0: 74 72 6f 6c 53 6f 63 6b 65 74 7d 22 20 2d 61 20  trolSocket}" -a 
05d0: 2d 66 20 2d 4e 20 22 24 7b 52 44 50 5f 53 53 48  -f -N "${RDP_SSH
05e0: 5f 4a 55 4d 50 42 4f 58 7d 22 0a 0a 09 23 20 56  _JUMPBOX}"...# V
05f0: 65 72 69 66 79 20 53 53 48 20 73 74 61 72 74 65  erify SSH starte
0600: 64 0a 09 73 73 68 50 69 64 3d 22 24 28 73 73 68  d..sshPid="$(ssh
0610: 20 2d 53 20 22 24 7b 73 73 68 43 6f 6e 74 72 6f   -S "${sshContro
0620: 6c 53 6f 63 6b 65 74 7d 22 20 2d 4f 20 63 68 65  lSocket}" -O che
0630: 63 6b 20 2f 64 65 76 2f 6e 75 6c 6c 20 32 3e 26  ck /dev/null 2>&
0640: 31 20 7c 20 67 72 65 70 20 27 70 69 64 3d 27 20  1 | grep 'pid=' 
0650: 7c 20 73 65 64 20 27 73 40 2e 2a 70 69 64 3d 40  | sed 's@.*pid=@
0660: 40 3b 73 40 29 2e 2a 24 40 40 27 29 22 0a 09 69  @;s@).*$@@')"..i
0670: 66 20 5b 20 2d 7a 20 22 24 7b 73 73 68 50 69 64  f [ -z "${sshPid
0680: 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 65 63 68  }" ]; then...ech
0690: 6f 20 22 55 6e 61 62 6c 65 20 74 6f 20 73 74 61  o "Unable to sta
06a0: 72 74 20 53 53 48 22 20 3e 26 32 0a 0a 09 09 65  rt SSH" >&2....e
06b0: 78 69 74 20 31 0a 09 66 69 0a 0a 09 68 6f 73 74  xit 1..fi...host
06c0: 49 64 3d 22 24 7b 68 6f 73 74 4e 61 6d 65 7d 3a  Id="${hostName}:
06d0: 24 7b 68 6f 73 74 50 6f 72 74 7d 21 24 7b 52 44  ${hostPort}!${RD
06e0: 50 5f 53 53 48 5f 4a 55 4d 50 42 4f 58 7d 22 0a  P_SSH_JUMPBOX}".
06f0: 0a 09 68 6f 73 74 4e 61 6d 65 3d 27 6c 6f 63 61  ..hostName='loca
0700: 6c 68 6f 73 74 27 0a 09 68 6f 73 74 50 6f 72 74  lhost'..hostPort
0710: 3d 22 24 7b 72 61 6e 64 6f 6d 50 6f 72 74 7d 22  ="${randomPort}"
0720: 0a 65 6c 73 65 0a 09 66 75 6e 63 74 69 6f 6e 20  .else..function 
0730: 63 6c 65 61 6e 75 70 28 29 20 7b 0a 09 09 72 65  cleanup() {...re
0740: 74 75 72 6e 20 30 0a 09 7d 0a 0a 09 68 6f 73 74  turn 0..}...host
0750: 49 64 3d 22 24 7b 68 6f 73 74 4e 61 6d 65 7d 3a  Id="${hostName}:
0760: 24 7b 68 6f 73 74 50 6f 72 74 7d 22 0a 66 69 0a  ${hostPort}".fi.
0770: 0a 74 72 61 70 20 63 6c 65 61 6e 75 70 20 45 58  .trap cleanup EX
0780: 49 54 0a 0a 23 20 43 6f 6e 6e 65 63 74 20 74 6f  IT..# Connect to
0790: 20 74 68 65 20 52 44 50 20 73 65 73 73 69 6f 6e   the RDP session
07a0: 0a 23 23 20 44 65 74 65 72 6d 69 6e 65 20 75 73  .## Determine us
07b0: 65 72 6e 61 6d 65 20 61 6e 64 20 64 6f 6d 61 69  ername and domai
07c0: 6e 0a 69 66 20 5b 20 2d 6e 20 22 24 7b 52 44 50  n.if [ -n "${RDP
07d0: 5f 55 53 45 52 4e 41 4d 45 7d 22 20 5d 3b 20 74  _USERNAME}" ]; t
07e0: 68 65 6e 0a 09 61 64 64 41 72 67 73 3d 28 22 24  hen..addArgs=("$
07f0: 7b 61 64 64 41 72 67 73 5b 40 5d 7d 22 20 2d 75  {addArgs[@]}" -u
0800: 20 22 24 7b 52 44 50 5f 55 53 45 52 4e 41 4d 45   "${RDP_USERNAME
0810: 7d 22 29 0a 65 6c 73 65 0a 09 61 64 64 41 72 67  }").else..addArg
0820: 73 3d 28 22 24 7b 61 64 64 41 72 67 73 5b 40 5d  s=("${addArgs[@]
0830: 7d 22 20 2d 75 20 22 24 28 77 68 6f 61 6d 69 29  }" -u "$(whoami)
0840: 22 29 0a 66 69 0a 0a 69 66 20 5b 20 2d 6e 20 22  ").fi..if [ -n "
0850: 24 7b 52 44 50 5f 44 4f 4d 41 49 4e 7d 22 20 5d  ${RDP_DOMAIN}" ]
0860: 3b 20 74 68 65 6e 0a 09 61 64 64 41 72 67 73 3d  ; then..addArgs=
0870: 28 22 24 7b 61 64 64 41 72 67 73 5b 40 5d 7d 22  ("${addArgs[@]}"
0880: 20 2d 64 20 22 24 7b 52 44 50 5f 44 4f 4d 41 49   -d "${RDP_DOMAI
0890: 4e 7d 22 29 0a 66 69 0a 0a 23 23 20 44 65 74 65  N}").fi..## Dete
08a0: 72 6d 69 6e 65 20 70 6f 72 74 0a 69 66 20 5b 20  rmine port.if [ 
08b0: 2d 6e 20 22 24 7b 68 6f 73 74 50 6f 72 74 7d 22  -n "${hostPort}"
08c0: 20 2d 61 20 22 24 7b 68 6f 73 74 50 6f 72 74 7d   -a "${hostPort}
08d0: 22 20 21 3d 20 27 33 33 38 39 27 20 5d 3b 20 74  " != '3389' ]; t
08e0: 68 65 6e 0a 09 61 64 64 41 72 67 73 3d 28 22 24  hen..addArgs=("$
08f0: 7b 61 64 64 41 72 67 73 5b 40 5d 7d 22 20 2d 74  {addArgs[@]}" -t
0900: 20 22 24 7b 68 6f 73 74 50 6f 72 74 7d 22 29 0a   "${hostPort}").
0910: 66 69 0a 0a 23 23 20 45 78 70 6f 72 74 20 74 68  fi..## Export th
0920: 65 20 70 61 73 73 77 6f 72 64 20 74 6f 20 74 68  e password to th
0930: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 6e  e environment an
0940: 64 20 74 65 6c 6c 20 78 66 72 65 65 72 64 70 20  d tell xfreerdp 
0950: 74 6f 20 75 73 65 0a 23 23 20 69 74 2e 20 20 54  to use.## it.  T
0960: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 70  his requires a p
0970: 61 74 63 68 65 64 20 78 66 72 65 65 72 64 70 2e  atched xfreerdp.
0980: 0a 69 66 20 5b 20 2d 6e 20 22 24 7b 52 44 50 5f  .if [ -n "${RDP_
0990: 50 41 53 53 57 4f 52 44 7d 22 20 5d 3b 20 74 68  PASSWORD}" ]; th
09a0: 65 6e 0a 09 65 78 70 6f 72 74 20 52 44 50 5f 50  en..export RDP_P
09b0: 41 53 53 57 4f 52 44 0a 0a 09 61 64 64 41 72 67  ASSWORD...addArg
09c0: 73 3d 28 22 24 7b 61 64 64 41 72 67 73 5b 40 5d  s=("${addArgs[@]
09d0: 7d 22 20 2d 70 20 45 4e 56 3a 52 44 50 5f 50 41  }" -p ENV:RDP_PA
09e0: 53 53 57 4f 52 44 29 0a 66 69 0a 0a 23 23 20 41  SSWORD).fi..## A
09f0: 63 74 75 61 6c 6c 79 20 63 61 6c 6c 20 78 66 72  ctually call xfr
0a00: 65 65 72 64 70 0a 78 66 72 65 65 72 64 70 20 2d  eerdp.xfreerdp -
0a10: 2d 70 6c 75 67 69 6e 20 64 72 64 79 6e 76 63 20  -plugin drdynvc 
0a20: 2d 2d 70 6c 75 67 69 6e 20 72 64 70 64 72 20 2d  --plugin rdpdr -
0a30: 2d 64 61 74 61 20 73 63 61 72 64 20 22 64 69 73  -data scard "dis
0a40: 6b 3a 70 77 64 3a 24 28 70 77 64 29 22 20 2d 2d  k:pwd:$(pwd)" --
0a50: 20 2d 2d 63 65 72 74 69 66 69 63 61 74 65 2d 6e   --certificate-n
0a60: 61 6d 65 20 22 24 7b 68 6f 73 74 49 64 7d 22 20  ame "${hostId}" 
0a70: 22 24 7b 61 64 64 41 72 67 73 5b 40 5d 7d 22 20  "${addArgs[@]}" 
0a80: 22 24 40 22 20 22 24 7b 68 6f 73 74 4e 61 6d 65  "$@" "${hostName
0a90: 7d 22 0a 72 65 74 75 72 6e 43 6f 64 65 3d 22 24  }".returnCode="$
0aa0: 3f 22 0a 0a 65 78 69 74 20 22 24 7b 72 65 74 75  ?"..exit "${retu
0ab0: 72 6e 43 6f 64 65 7d 22 0a                       rnCode}".