#!/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 # log in the remote system # DISPLAY=:0 xclip -o # extracts remote's clipboard # # Usage: # # xclip-ssh send [stdin|data] # xclip-ssh receive [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 [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 < /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 < /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 $*