diff options
Diffstat (limited to 'xclip-ssh')
| -rwxr-xr-x | xclip-ssh | 106 | 
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 $* | 
