X11

openSUSE als Terminalserver einrichten

Linux benutzt als grafische Umgebung das X11-Paket.
Die Ausgabe wird über eine Netzwerkclient und -serverkomponente gewährleistet.
Wobei die Namensgebung im X11-Kontext (Client/Server) genau andersherum funktioniert als z.B. bei einem Webserver.
Dort ist der Browser der Client.
Der X-Client ist also der Rechner, der die zu startenden Programme beherbergt. Der X-Server stellt die Programmausgabe nur dar.
Der X-Client empfängt vom X-Server seine Befehle über das X11-Protokoll und führt diese aus.
Dann schickt er das Ergebnis an den X-Server der dieses nur noch darstellt.
Das Protokoll ist unverschlüsselt und sollte deshalb nur hinter durch Firewalls geschützte Netze benutzt werden.
Um einen Suse-Rechner zu einem X-Client zu machen, sind folgende Schritte notwendig:

1. starte YAST2 / System / Editor für /etc/sysconfig-Dateien
2. klicke auf Desktop /Displaymanager und ändere folgende Einträge :

DISPLAYMANAGER_REMOTE_ACCESS = yes (prinzipielle Freigabe übers Netz)
DISPLAYMANAGER_ROOT_LOGIN_REMOTE = yes (wenn der root Zugriff haben soll;Sicherheitsrisiko)
DISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN = yes (Standardport 6000 benutzen)
anschließend <beenden> + <speichern>

3. Auf der Firewall muss der TCP-Port und der UDP-Port 177 freigeschaltet werden.

starte dazu YAST / Sicherheit und Benutzer / Firewall / erlaubte Dienste / zu erlaubender Dienst : Fernzugriff auf Display-Manager <hinzufügen> + <übernehmen>
Oder die Firewall im Yast abschalten (nicht empfohlen).

4. Installiere und aktiviere lightdm

XDMCP geht nicht mit sddm, gmd, kdm !

zypper in lightdm
update-alternatives --config default-displaymanager
5. Listener konfigurieren in /etc/X11/xdm/Xaccess

wenn der Server aus allen Netzen erreichbar sein soll:

echo "LISTEN *" >>/etc/X11/xdm/Xaccess
6. Starte den Rechner neu.
reboot

Anschließend sollte ein Zugriff mit „X -query meinServer -once“ von einem entfernten Linuxrechner möglich sein.
Wenn die grafische Oberfläche auf dem entfernten Rechner schon gestartet ist sollte

"X :1 -query meinServeroderIP -once "

einen 2.X-server starten. (Konsole8)
Alternativ ist auch der Start von Xnest möglich.

"Xnest :1 -query meinServeroderIP -once "

Von einem Windowsrechner kann bei installiertem Xming ( download hier ) mit

"c:\programme\xming\xming.exe -query meinServeroderIP -once" 

die Linuxoberfläche auf den Windowsrechner geholt werden.
Sicherheitshinweis: in der Datei /var/X11R6/lib/xdm/Xaccess kann der Kreis der erlaubten Rechner eingeschränkt werden.
Dazu muss die Zeile mit dem Sternchen (alle Rechner erlauben) auskommentiert werden.
Stattdessen kann dort einfach eine IPadresse oder ein Rechnername denen der Zugriff erlaubt sein soll, eingetragen werden.
Auch kann stattdessen eine IP-Maske eingetragen werden.z.B. 192.168.1.*

5. Fehlerquellen

-die gegenseitige DNS-Namensauflösung zwischen den Rechnern funktioniert nicht. Nur die IP angeben funktioniert wegen reverser DNSauflösung nicht!!!
-Ports 6000 und 177 offen?

netstat -pan | grep 6000
netstat -pan | grep 177

dies ist zwingend erforderlich!!!
-der X-Server wird durch eine Firewall geblockt.

Debian als KDE-Terminalserver

Zuerst müssen die benötigten Pakete installiert werden:

 apt-get install xdm kde 

Danach stellen Sie den StandardDisplaymanager in der Datei /etc/X11/default-display-manager ein:

/usr/bin/xdm

Danach konfigurieren Sie die Zugriffskontrolle auf die Anmeldung in der Datei /etc/X11/xdm/Xaccess:

#alle Rechner haben Zugriff:
*
#oder nur ein Rechner hat Zugriff
meinClient

Danach entscheiden Sie ob der lokale X-Server auch gestartet werden soll und auf Anfragen von außen antworten soll:
Löschen Sie dazu alle „-nolisten tcp“ -Einträge. Bsp:

:0 local /usr/bin/X :0 vt7 -nolisten tcp

in

:0 local /usr/bin/X :0 vt7

Danach entscheiden Sie, ob der xdm auf auf externe Anfragen per XDMCP-Protokoll reagieren soll:
Kommentieren Sie dazu in der Datei /etc/X11/xdm/xdm-config die letzte Zeile mit einem !Ausrufezeichen aus:

!DisplayManager.requestPort 0

Stoppen Sie den xdm:

/etc/init.d/xdm stop

und killen alle eventuell danach noch laufenden xdm und X-Programme:

killall xdm;killall X

starten Sie den xdm neu:

/etc/init.d/xdm start

oder booten den rechner neu.
versuchen Sie sich von einem entfernten Rechner die X-Oberfläche zu holen:

X -query meinServer 

oder

X -query meinServer :1


Debian als Gnome-Terminalserver

Zuerst müssen die benötigten Pakete installiert werden:

apt-get install gdm3 

Dann muss der Anmeldebildschirm noch in der Datei /etc/gdm3/daemon.conf freigegeben werden:

[xdmcp]
Enable=true

Auch soll root sich anmelden können:

[security]
AllowRemoteRoot=true

In der PAM-Datei /etc/pam.d/gdm3 den folgenden Eintrag auskommentieren:

#auth   required        pam_succeed_if.so user != root quiet_success

Dann nur noch den Dienst neustarten:

/etc/init.d/gdm3 restart

Jetzt kann die Anmeldung per X erfolgen:

X -query meinServer :1


nur ein einzelnes X-Programm auf einem entfernten Rechner anzeigen

myFirmsrv: ein Linuxserver auf dem ein Programm(myprog) installiert ist, dessen Ausgabe ich aber auf meinen Client holen will.
myFirmcln: ein X-server mit einem xtermFenster muss gestartet sein.
zunächst starte ich einen weiteren X-Server auf meinem client(myFirmcln)

X :1 & xterm -display :1

jetzt gebe ich das X-Display für entfernte Verbindungen frei:

xhost +myFirmsrv

dann stelle ich eine ssh-Verbindung zum X-Client (myFirmsrv) her.

ssh einUser@myFirmsrv
password: (das Passwort dazu)

dann setze ich die Displayvariable:

export DISPLAY=myFirmcln:1

jetzt starte ich einen minimalen Windowmanager(twm &) und das gewünschte Programm(myprog):

twm &
#oder startkde &
#oder wmstart &
myprog

Auf dem (Client-)Display erscheint jetzt die Ausgabe des gestarten Programms.
Alternative einfache Möglichkeit:

twm -display myFirmcln:1


häufige Fehler

Firewall ist an
gegenseitige DNS-Auflösung funktioniert nicht.


Bildschirmschoner und Monitorabdunklung abschalten

Editiere die /etc/X11/xorg.conf.
Füge die foldenden Zeilen unter Section „ServerFlags“ zusätzlich ein:

Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"

starte anschließend den X-Server oder den ganzen Rechner neu.

Sonstiges

Xterm-Schriftgröße ändern:
entweder mit [Strg]+reMaus oder
in der ~/.Xresources:

XTerm*Font: 10x20

Kontextmenü von twm ändern :

/usr/share/X11/twm/system.twmrc

zweiten entfernten X-Server starten mit :

X -indirect ServeroderIP :1

oder lokal:

startx -- :1

VESA-treiber in SUSE benutzen obwohl ein anderer Treiber vom system bevorzugt wird :

sax2 -r -m 0=vesa

XMING verdeckt starten:
ohne Authentifizierung!

c:\Programme\Xming\Xming.exe -ac -multiwindow -clipboard +kb -xkblayout de -dpi 108

oder:

"C:\Program Files (x86)\Xming\Xming.exe" -ac -clipboard -multiwindow +kb -xkblayout de -dpi 108

dann auf dem X-Client:

export DISPLAY=entfernterServer:0
twm &

oder besser:

c:\Programme\Xming\Xming.exe -ac -multiwindow -clipboard +kb -xkblayout de -dpi 108
c:\Programme\PuTTY\plink.exe -ssh -X username@xclientsrv export DISPLAY=%computername%:0 ; xterm  

zwischen den virtuellen Konsolen umschalten
auf die virtuelle Konsole 1 schalten:

chvt 1

zurück auf den X-server schalten:

chvt 7


Skript zum Ändern der Monitoreinstellungen:

chgMon.sh
#!/bin/bash
# chgMon.sh / Richard Borwinius / 2016
# kleines Skript um die Monitoreinstellungen initial zu ändern,
# wenn zwei Monitore vorhanden sind
# erforderliche Programme: xrandr, zenity, bash(nicht nur sh!)
# Bei Aufruf von "chgMon.sh 2" und zwei angeschlossenen Monitoren wird automatisch xinerama eingestellt
 
buf=(`xrandr 2>/dev/null | grep " connected" | cut -d " " -f1`)
echo angeschlossene Monitore ${#buf[*]} ?
if [ ${#buf[*]} -eq 2 ]; then 
 
  if [ $1 -eq 2 ]; then
    xrandr --output  ${buf[0]} --auto --left-of ${buf[1]} --auto 
    exit 0;
  fi
  zenity --question --text "Sollen die Monitoreinstellungen jetzt geändert werden?" || exit;
 
  auswahl=`zenity --list --radiolist --width=400 --height=400\
	--title "Anzeige ändern" \
	--text "Wählen Sie die Monitoreinstellungen jetzt aus." \
	--column="" --column="" --column="Einstellungen" \
	"" "1" "Ausgabe auf Monitor 1" \
	"" "2" "Ausgabe auf Monitor 2" \
	"" "3" "Xinerama rechts <-> links" \
	"" "4" "Xinerama links  <-> rechts" \
	"" "5" "Monitore Klonen";`
  echo $?
  if [ -z "$auswahl" ] ; then 
      auswahl=0
      echo Abbruch
  fi
 
  if [ $auswahl -eq 1 ]
  then
	xrandr --output ${buf[0]} --auto --output ${buf[1]} --off
  fi
  if [ $auswahl -eq 2 ]
  then
        xrandr --output ${buf[0]} --off --output ${buf[1]} --auto
  fi
  if [ $auswahl -eq 3 ]
  then
        xrandr --output  ${buf[0]} --auto --left-of ${buf[1]} --auto
  fi
  if [ $auswahl -eq 4 ]
  then
        xrandr --output  ${buf[1]} --auto --left-of ${buf[0]} --auto
  fi
  if [ $auswahl -eq 5 ]
  then
       xrandr --output ${buf[0]} --auto --output ${buf[1]} --same-as ${buf[0]} --auto
  fi
 
fi


Mimetypes ändern:

xdg-mime install /opt/Citrix/ICAClient/desktop/Citrix-mime_types.xml
update-desktop-database
update-mime-database /usr/share/mime

Notfications senden

notify-tools muss installiert sein.
als root:

sudo -u benutzername DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/bus notify-send 'Hello world!' 'This is an example notification.' -t 0

oder:

gdbus call --session \
  --dest=org.freedesktop.Notifications \
  --object-path=/org/freedesktop/Notifications \
  --method=org.freedesktop.Notifications.Notify \
  "" 0 "" 'Hello world!' 'This is an example notification.' \
  '[]' '{"urgency": <1>}' 5000  

oder:

while true; do
date=$(date)
notify-send "$date" -h string:x-canonical-private-synchronous:my-notification
sleep 1

done

zurück