home
erste Version am 27.10.2016
letzte Änderung am 30.10.2016

Clipboard-Inhalt übertragen


Eine Client/Server-Anwendung zur Übertragung des Clipboard-Inhaltes von einem Rechner ins Clipboard eines anderen Rechners.



Ich benutze primär zwei Linux-Rechner, die über einen KVM-Switch am selben Keyboard/Video/Mouse hängen.
Einer der Rechner läuft rund um die Uhr, ist daher stromsparend ausgelegt (und heißt konsequenterweise 11w - für 11 Watt PC).
Mein Haupt-Rechner ist nur bei Bedarf eingeschaltet und bietet deutlich mehr RAM- und Festplatten-Kapazität.
Nicht selten kommt es vor, dass ich an dem Stromspar-Rechner mit einer Internet-Recherche für irgendwas anfange, dabei etwas brauchbares finde, was ich dann am großen Rechner weiter-nutzen möchte.
Und dazu benötige ich am großen Rechner üblicherweise eine (oft ziemlich lange) URL vom Stromspar-Rechner.
VNC erschien mir für diesen Zweck ziemlicher Overkill - aber der Workaround, eine Datei mit der URL anzulegen und diese dann per scp zu übertragen, ist auf die Dauer auch nervig.
Daher also jetzt der Weg über zwei kleine Python-Scripte.

Die Scripte nutzen das Commandline-Tool xclip (z.B. xclip-0.11-20.1.2.x86_64) zur Interaktion mit dem jeweiligen bzw. lokalen Clipboard.
Dementsprechend ist erstmal xclip auf beiden Systemen zu installieren.

Weiterhin ist der im Server-Script eingestellte Port (hier also 9700) in der Firewall des Systems freizugeben, auf dem das Server-Script laufen wird.
Die Scripte sind für Systeme gedacht, die in einem LAN miteinander verbunden sind. Der offene Port sollte nicht vom Internet aus erreichbar sein.

In beiden Scripten ist der Hostname "11w" natürlich an die eigenen Gegebenheiten anzupassen.
Stattdessen ist der Hostname oder die IP-Adresse des Systems einzutragen, auf dem das Server-Script läuft.



Das Server-Script läuft auf dem Rechner, dessen Clipboard ausgelesen werden soll.
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# Den Inhalt des lokalen Clipboards via Socket anbieten.
#
# 27.10.2016  Detlev Ahlgrimm
#
# Quelle: https://docs.python.org/2/library/socketserver.html

import SocketServer
import subprocess

HOSTPORT=("11w", 9700)


class MyTCPHandler(SocketServer.BaseRequestHandler):
  def handle(self):
    dummy=self.request.recv(1024)
    try:
      lns=subprocess.check_output(['xclip', '-selection', 'c', '-o'])
    except:
      lns=""
    self.request.sendall(lns)


if __name__=="__main__":
  server=SocketServer.TCPServer(HOSTPORT, MyTCPHandler)
  server.serve_forever()


Das Client-Script stellt eine Verbindung zum Server-Script her, empfängt von dort den Inhalt des Clipboards und kopiert diesen ins lokale Clipboard.
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# Den Inhalt eines entfernten Clipboards via Socket empfangen und
# ins lokale Clipboard schreiben.
#
# 27.10.2016  Detlev Ahlgrimm

import socket
import subprocess

DEST_HOSTPORT=("11w", 9700)


def getViaSocket(hostport):
  sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  full=list()
  try:
    sock.connect(hostport)
    sock.send(b'huhu')
    part="-"
    while part:
      part=sock.recv(1024)
      full.append(part)
  except:
    print "Die Verbindung zu %s konnte nicht hergestellt werden!"%(DEST_HOSTPORT,)
  finally:
    sock.close()
  return(''.join(full))


if __name__=="__main__":
  cb=getViaSocket(DEST_HOSTPORT)
  if cb!="":
    print cb + "<"
    p=subprocess.Popen(['xclip', '-selection', 'c'], stdin=subprocess.PIPE, close_fds=True)
    p.communicate(input=cb)
Wenn ich die MAN-Page von xclip richtig deute, wird ausschließlich Text übertragen.

Das Server-Script wird vorzugsweise automatisch mit der Desktop-Umgebung gestartet.
Bei xfce wäre das also unter: Einstellungen / Sitzung und Startverhalten / Automatisch gestartete Anwendungen.
Ich habe dort einen Eintrag drin, der die Datei /home/dede/bin/autostart.sh aufruft.
Und in dieser Datei befindet sich u.a. die Zeile:
nohup /home/dede/bin/shareclipd.py &

Das Client-Script macht sich am Besten in der Task-Leiste auf einem Starter.