forked from matsuolab/virtual_desktop_docker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrdp-ssh
More file actions
executable file
·100 lines (76 loc) · 2.91 KB
/
rdp-ssh
File metadata and controls
executable file
·100 lines (76 loc) · 2.91 KB
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
#!/usr/bin/env bash
COMMAND=${@: -1}
RUNNING=false
BASE_PORT=6090
LOCAL_PORT=6090
while getopts ":n:p:a:" opt; do
case "${opt}" in
n ) #recover r_file
NAME="$OPTARG"
echo $NAME
;;
a ) #recover r_file
HOST="$OPTARG"
echo $HOST
;;
p ) #recover r_file
LOCAL_PORT="$OPTARG"
;;
esac
done
DESKTOP_REMOTES=$(ssh $HOST "docker ps --filter ancestor=ghcr.io/matsuolab/virtual_desktop --format '{{.Names}}'")
echo $NAME $COMMAND
if [ ! -z "${NAME}" ] && [[ ! $(echo ${DESKTOP_REMOTES[@]} | tr ' ' '\n' | awk '$1 == "'"$NAME"'"{print $0}' | wc -l) -eq 0 ]]; then
RUNNING=true
fi
if [[ $COMMAND == "list" ]]; then
echo $DESKTOP_REMOTES
exit 0
elif [[ $COMMAND == "start" ]]; then
echo "Starting..."
if $RUNNING; then
echo "Already running! Connecting..."
REMOTE_PORT=$(ssh $HOST "docker port $NAME | head -n 1 | awk -F: '{print \$NF}'")
REMOTE_DISPLAY=$(($REMOTE_PORT - $BASE_PORT))
else
LAST_DISPLAY=$(ssh $HOST ls /tmp/.X11-unix/ | sort -V | tail -n 1 | cut -c 2-)
REMOTE_DISPLAY=$(($LAST_DISPLAY + 1))
# Find an available port by checking both X11 sockets and Docker port usage
REMOTE_PORT=$(($BASE_PORT + $REMOTE_DISPLAY))
USED_PORTS=$(ssh $HOST "docker ps --format '{{.Ports}}' | grep -oP '0\.0\.0\.0:\K[0-9]+' | sort -n")
# Keep incrementing until we find a free port
while echo "$USED_PORTS" | grep -q "^$REMOTE_PORT$"; do
REMOTE_DISPLAY=$(($REMOTE_DISPLAY + 1))
REMOTE_PORT=$(($BASE_PORT + $REMOTE_DISPLAY))
done
NAME=${NAME:=desktop-$REMOTE_DISPLAY}
echo $LAST_DISPLAY $REMOTE_DISPLAY
echo "Will create new display :$REMOTE_DISPLAY. To use on the remote, execute the following:"
echo "export DISPLAY=:$REMOTE_DISPLAY"
ssh $HOST docker run --rm -d -p $REMOTE_PORT:6080 -e DISPLAY=:$REMOTE_DISPLAY --name $NAME -v /tmp/.X11-unix:/tmp/.X11-unix ghcr.io/matsuolab/virtual_desktop:latest
fi
echo "Started \"$NAME\"!"
echo "Open http://localhost:$LOCAL_PORT in browser"
ssh -t -o ExitOnForwardFailure=no -L $LOCAL_PORT:localhost:$REMOTE_PORT $HOST DISPLAY=:$REMOTE_DISPLAY bash -l
elif [[ $COMMAND == "connect" ]]; then
if ! $RUNNING ; then
echo "Not running"
exit 1
fi
echo "Open http://localhost:$LOCAL_PORT in browser"
REMOTE_PORT=$(ssh $HOST "docker port $NAME | head -n 1 | awk -F: '{print \$NF}'")
REMOTE_DISPLAY=$(($REMOTE_PORT - $BASE_PORT))
ssh -t -o ExitOnForwardFailure=no -L $LOCAL_PORT:localhost:$REMOTE_PORT $HOST DISPLAY=:$REMOTE_DISPLAY bash -l
elif [[ $COMMAND == "stop" ]]; then
if ! $RUNNING ; then
echo "Not running"
exit 1
fi
echo "Stopping..."
REMOTE_PORT=$(ssh $HOST "docker port $NAME | head -n 1 | awk -F: '{print \$NF}'")
REMOTE_DISPLAY=$(($REMOTE_PORT - $BASE_PORT))
ssh $HOST "docker stop -t 0 $NAME; rm /tmp/.X11-unix/X$REMOTE_DISPLAY"
echo "Stopped"
else
echo help
fi