aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSilvio Rhatto <rhatto@riseup.net>2021-02-26 14:59:09 -0300
committerSilvio Rhatto <rhatto@riseup.net>2021-02-26 14:59:09 -0300
commit8764091c915b914b038398b44a51e91fa704ad48 (patch)
tree145d43436dab0d206c429eba59ac4a048f56da00
parent02c3d6eda63d77418046041a73c1c8a157a21467 (diff)
downloadscripts-8764091c915b914b038398b44a51e91fa704ad48.tar.gz
scripts-8764091c915b914b038398b44a51e91fa704ad48.tar.bz2
Feat: adds xclip-ssh, still unfinished
-rwxr-xr-xxclip-ssh106
1 files changed, 106 insertions, 0 deletions
diff --git a/xclip-ssh b/xclip-ssh
new file mode 100755
index 0000000..46c94b3
--- /dev/null
+++ b/xclip-ssh
@@ -0,0 +1,106 @@
+#!/usr/bin/env bash
+#
+# Intersystem communication via clipboard over SSH!
+# Transmits data using the clipboard via SSH session.
+#
+# Description:
+#
+# xclip-ssh does what the same says - xclip over SSH.
+# Works even with a remote host in a .onion service!
+# And even between virtual machines!
+#
+# Works around the following PoC:
+#
+# ssh -X <server> # log in the remote system
+# DISPLAY=:0 xclip -o # extracts remote's clipboard
+#
+# Usage:
+#
+# xclip-ssh send <server> [stdin|data]
+# xclip-ssh receive <server> [stdout|xclip]
+#
+# Examples:
+#
+# cat /path/to/file | xclip-ssh send server
+# xclip-ssh send server "some text"
+# xclip-ssh receive server stdout > saved.txt
+
+# Parameters
+BASENAME="`basename $0`"
+ACTION="$1"
+SERVER="$2"
+STORE="$3"
+
+# Display usage
+function xclip_ssh_usage {
+ echo "usage: $BASENAME <send|receive> <server> [data]"
+ exit 1
+}
+
+# Send data
+function xclip_ssh_send {
+ if [ -z "$STORE" ]; then
+ STORE="xclip"
+ fi
+
+ if [ "$STORE" == "xclip" ]; then
+ CONTENT="`xclip -o`"
+ elif [ "$STORE" == "stdin" ]; then
+ mapfile -t CONTENT
+ #printf '%s\n' "${CONTENT[@]}"
+ else
+ shift 2
+ CONTENT="$*"
+ fi
+
+ # See https://askubuntu.com/questions/804095/how-do-i-disable-the-message-of-the-day-motd-on-ubuntu-14-04
+ ssh -q -X $SERVER bash <<EOF
+ ##### BEGIN REMOTE SCRIPT #####
+ if ! which xclip &> /dev/null; then
+ echo "$BASENAME: missing xclip in the remote server"
+ else
+ echo ${CONTENT[@]} | DISPLAY=:0 xclip
+ fi
+ ##### END REMOTE SCRIPT #######
+EOF
+}
+
+# Receive data helper
+function xclip_ssh_helper {
+ ssh -q -X $SERVER bash <<EOF
+ ##### BEGIN REMOTE SCRIPT #####
+ if ! which xclip &> /dev/null; then
+ echo "$BASENAME: missing xclip in the remote server"
+ else
+ DISPLAY=:0 xclip -o
+ fi
+ ##### END REMOTE SCRIPT #######
+EOF
+}
+
+# Receive data
+function xclip_ssh_receive {
+ if [ -z "$STORE" ]; then
+ STORE="xclip"
+ fi
+
+ if [ "$STORE" == "stdout" ]; then
+ xclip_ssh_helper
+ echo ""
+ else
+ xclip_ssh_helper | xclip -i
+ fi
+}
+
+# Check
+if [ -z "$2" ]; then
+ xclip_ssh_usage
+elif [ "$ACTION" != "send" ] && [ "$ACTION" != "receive" ]; then
+ xclip_ssh_usage
+elif ! which xclip &> /dev/null; then
+ echo "$BASENAME: please install xclip"
+ exit 1
+fi
+
+# Dispatch
+xclip_ssh_$ACTION $*