bash/sources/42_clipboard_server
raw ยท 2289 bytes
SSH_CLIPBOARD_DIR="${SSH_CLIPBOARD_DIR:-$HOME/.cache}"
SSH_CLIPBOARD_SOCKET="${SSH_CLIPBOARD_SOCKET:-$SSH_CLIPBOARD_DIR/ssh-clipboard.sock}"
SSH_CLIPBOARD_PIDFILE="${SSH_CLIPBOARD_PIDFILE:-$SSH_CLIPBOARD_DIR/ssh-clipboard.pid}"
SSH_CLIPBOARD_LOG="${SSH_CLIPBOARD_LOG:-$SSH_CLIPBOARD_DIR/ssh-clipboard.log}"
# This path is created on the remote host.
# Override it when the remote username differs from the local username.
SSH_CLIPBOARD_REMOTE_SOCKET="/tmp/ssh-clipboard-client.sock"
function clipboard_server_running {
local pid
[[ -f "$SSH_CLIPBOARD_PIDFILE" ]] || return 1
read -r pid < "$SSH_CLIPBOARD_PIDFILE"
[[ "$pid" =~ ^[0-9]+$ ]] || return 1
kill -0 "$pid" 2>/dev/null
}
function init_clipboard_server {
case "$OSTYPE" in
darwin*)
command -v socat >/dev/null 2>&1 || {
echo "clipboard server: socat is not installed" >&2
echo "Install it with: brew install socat" >&2
return 1
}
[[ -x /usr/bin/pbcopy ]] || {
echo "clipboard server: /usr/bin/pbcopy was not found" >&2
return 1
}
if clipboard_server_running; then
return 0
fi
mkdir -p "$SSH_CLIPBOARD_DIR"
chmod 700 "$SSH_CLIPBOARD_DIR"
rm -f "$SSH_CLIPBOARD_SOCKET" "$SSH_CLIPBOARD_PIDFILE"
(
umask 077
socat \
"UNIX-LISTEN:$SSH_CLIPBOARD_SOCKET,fork,mode=600" \
EXEC:/usr/bin/pbcopy \
>>"$SSH_CLIPBOARD_LOG" 2>&1 &
echo "$!" > "$SSH_CLIPBOARD_PIDFILE"
)
;;
cygwin*)
echo "clipboard server: Cygwin support is not implemented" >&2
return 1
;;
*)
echo "clipboard server: $OSTYPE is not supported" >&2
return 1
;;
esac
}
function stop_clipboard_server {
local pid
if clipboard_server_running; then
read -r pid < "$SSH_CLIPBOARD_PIDFILE"
kill "$pid" 2>/dev/null || true
fi
rm -f "$SSH_CLIPBOARD_SOCKET" "$SSH_CLIPBOARD_PIDFILE"
}
function clipboard_server_config {
cat <<EOF
RemoteForward $SSH_CLIPBOARD_REMOTE_SOCKET $SSH_CLIPBOARD_SOCKET
StreamLocalBindUnlink yes
ExitOnForwardFailure yes
EOF
}
function sshc {
init_clipboard_server || return
echo "-- ssh with clipboard server"
command ssh \
-o StreamLocalBindUnlink=yes \
-o ExitOnForwardFailure=yes \
-R "$SSH_CLIPBOARD_REMOTE_SOCKET:$SSH_CLIPBOARD_SOCKET" \
"$@"
}
if init_clipboard_server; then
alias ssh='sshc'
fi