• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Programm direkt auf einem bestimmten Desktop starten

Hallo,

ich habe mir unter Xubuntu mehrere Desktops eingerichtet zwischen denen ich per STRG,ALT und Cursor wechsel. Es geht doch irgendwie, dass man Programme direkt in einen dieser Desktops startet, aus der KOmmandozeile oder einem Programmstarter heraus? Bei

DISPLAY=:0.1 firefox

kommt als Fehler

Failed to connect to Mir: Failed to connect to server socket: Datei oder Verzeichnis nicht gefunden
Unable to init server: Verbindung ist gescheitert: Verbindungsaufbau abgelehnt
Error: cannot open display: :0.1

Wechsel ich manuell zu dem Desktop kann ich Firefox starten. Ich weiß, dass es auch Tools dafür gibt, müsste doch aber auch so gehen.

bunter fisch
 
A

Anonymous

Gast
Du hast wohl auch noch einen 2 Thread offen ( https://linux-club.de/forum/viewtopic.php?f=93&t=122383 ), bei dem es um etwas ähnliches geht. Hier mal etwas ausführlicher das ganze Problem ein bisschen erklärt, eventuell kann das der eine oder andere auch noch gebrauchen. Scheinbar fehlen dir hier noch ein paar Grundlagen zum besseren Verständnis, man muss sich mit dem Problem etwas auseinandersetzen, ganz so einfach ist es nicht.

Also erstmal das Ganze ist ein Netzwerkdienst. Der X-Server ist an eine Grafikkarte, Maus und Tastatur gebunden bzw. konfiguriert, und übernimmt die Anzeige, das ist der Diensteanbieter.
Der Client, das ist jetzt das Programm/Prozess das eine grafische Anzeige benötigt und mit Maus und Tastatur Eingaben an der grafischen Oberfläche machen will. und muss sich dafür mit einem X-Server verbinden, hier gilt jeder neue Prozess ist ein eigener Client und muss sich somit mit einem X-Server verbinden. Maus und Tastatur werden dann entsprechend umgeschalten, je nach dem welches Fenster jetzt auf dem X-Server gerade aktiv ist, bekommt dieser Client die aktuelle Verbindung zur Maus und Tastatur. Bedeutet im Umkehrschluss, jeder Prozess könnte sich zB auch mit einem anderem X-Server verbinden, und da das Ganze netzwerkfähig ist, sogar auf einem S-Server der gar nicht auf dem selben Rechner oder im selben Netz läuft wie der Client. Es ist also möglich an einem Rechner mit X-Server zu arbeiten und dort ganz normal mit Maus und Tastatur zu arbeiten, aber die Programme auf einem ganz anderem Rechner ausführen zu lassen. Also zB mit dem Windowslaptop in Deutschland sitzen, darauf einen X-Server starten, mit putty zu einem Linux-Server in Amerika verbinden und dabei das X-Netzwerkprotokoll tunneln, und dann auf dem Server in Amerika Firefox starten. Damit kann ich dann quasi mit der Maus von Deutschland aus mit der Netzadresse aus Amerika im Netz surfen, bzw grafisch in meiner Firma arbeiten, obwohl ich in einem ganz anderem Netz bin und nur über ssh mit meinem Arbeitsplatzrechner verbunden bin.

Der X-Server benötigt in jedem Fall eine (von meinerm derzeitigen Standort aus gesehen) eindeutige Adresse damit er gefunden werden kann: Hostname:XServerNR.Schirm

  • Hostname ist zB Rechnernamen.Domain.com oder die IP4 oder IP6 zB 100.100.100.100 oder localhost. Bei localhost kann man sie auch weglassen.
  • Die XServerNR ist eine Zahl die der lokalen Nummer des X-Servers entspricht. 0 ist meist der Erste gestartete , weitere können auf der selben Maschine gestartet werden. Diese Nummer hat dann auch einen Bezug zu den Ports auf denen dieser X-Server arbeitet. Bei Tunneln von X über ssh wird eine Portweiterleitung gemacht, und damit eine logische XServerNR erzeugt die hier um einen Offsetwert größer ist als die Nummer des X-Servers. Typisch sind hier Werte ab 10.
  • Der Schirm wäre dann die Nummer des Bildschirms, wenn du also nur eine Monitor hast, dann 0, bei 2 Monitoren gäbe es dann 0 oder 1 usw. bei nur einem Schirm, kann die 0 auch weggelassen werden.
Komplette Adresse also zB : Rechnername.Domain.com:0.0
lokal und gekürzt zB. :0

Die X-Serveradresse wird in einer Variablen DISPLAY gespeichert und exportiert, Damit bekommt jeder Prozess bei Starten die Möglichkeit einen definierten X-Server anzusprechen, denn durch das exportieren hat diese Variable jeder Prozess automatisch in der Umgebung.
Man braucht also nur die DISPLAY Variabel zu setzen, und den richtigen Key für den entsprechenden X-Server in dieser Variable zu besitzen, und schon kann jeder Prozess dort mit dem X-Server arbeiten.


Soweit, so einfach, aber es ist einiges zu beachten: Der ssh-Deamon muss das zulassen( Freigabe in sshd.config) , und der ssh-Client muss entsprechend konfiguriert sein oder mit den entsprechenden Optionen gestartet werden , dann klappt das erstmal mit dem Tunneln von X ( für den Fall das der X-Server auf dem Rechner mit dem ssh-Client gestartet ist). ssh macht hier beim Verbindungsaufruf eine ganze Menge im Hintergrund für uns, was man so nicht zwangsläufig sieht.
der X-Server hat nämlich auch Zugriffsrechte und das bedeutet, nicht jedes daher gelaufene Prozess kann so einfach hier auf dem X-Server Ausgaben machen. Nur wer die entsprechenden Rechte hat, kann den X-Server nutzen. Die Rechte müssen hierbei vom Server als eine Art Key bezogen werden, und der Key ist nach jedem Start des X-Server ein anderer muss also jedes mal neu bezogen werden. ssh-Client und ssh-Deamon machen das automatisch bei Verbindungsaufbau wenn das X-Protokoll getunnelt wird und ein X-Server auf dem Clientrechner schon läuft und der User beim Starten des ssh-Client Zugriffsrechte auf den X-Server hat.

In anderen Fällen muss man das per Hand machen, was ich hier mal an einem Beispiel zeigen will.
Wir sind hier in unserem Beispiel an einem Rechner( ULTRA-01) mit User neutest angemeldet. Es laufen hier schon 2 X-Server für andere User.
wir wollen uns den Zugriff für beide X-Server verschaffen und mit der Display-Variable entscheiden auf welchen wir die Grafische Ausgabe senden. wir gehen davon aus, wir kennen die Passwörter der User, die hier schon einen X-Server laufen haben (bzw haben entsprechende sudo Rechte, um einfach mittels sudo auf den entsprechenden User zu wechseln)

ps -efl zeigt uns 2 X-Server-Prozesse auf der Maschine
Code:
neutest@ULTRA-01:~> ps -efl | grep Xorg
4 S root      3475  3441  3  80   0 - 22423 ?      19:58 tty7     00:06:45 /usr/bin/Xorg -br :0 vt7 -nolisten tcp -auth /var/lib/xdm/authdir/authfiles/A:0-mcJ7Na
4 S root      5334  3441  1  80   0 - 18312 ?      22:54 tty8     00:00:10 /usr/bin/Xorg -br :1 vt8 -auth /var/lib/xdm/authdir/authfiles/A:1-G1INHa
0 S neutest   6371  6357  0  80   0 -  1049 pipe_w 23:09 pts/5    00:00:00 grep --color=auto Xorg
einer am vt7 hat die Adresse :0 und einer am vt8 hat die Adresse :1 (ausgeschrieben, localhost:0.0 und localhost:1.0 )
und wir sehen, beide arbeiten mit einer auth-file, das ist der Schlüssel den wir brauchen, wenn wir Zugriff darauf haben wollen.

Wir wissen aber noch nicht, wer hier welchen X-Server betreibt, schauen wir uns da mal an wer wie angemeldet ist.
Code:
neutest@ULTRA-01:~> who 
robi     :0           2018-05-01 19:58 (console)
robi     pts/0        2018-05-01 19:58
robi     pts/1        2018-05-01 19:58
robi     tty2         2018-05-01 22:46
egon     :1           2018-05-01 22:55 (localhost)
egon    pts/2        2018-05-01 22:55 (:1)
egon     pts/3        2018-05-01 22:55 (:1)
egon     pts/4        2018-05-01 22:55 (:1)
neutest  tty3         2018-05-01 23:08
Wir sehen hier auch in der 2. Spalte unter anderem die beiden X-Server . :0 am Virtuellen Terminal vt7 gehört User robi, und :1 am virtuellem Terminal vt8 gehört User egon.

Unsere aktuellen Rechte für eventuelle X-Server sind in unserem Homeverzeichnis in einer Datei enthalten.
/home/neutest/.Xauthority
Hilfe zu den folgenden Befehlen gibt es uA. in der Manpage von xauth.
Wir gehen jetzt einfach davon aus, dort stehen eh nur alte Rechte von gestern drin, wir brauchen jetzt die von den neu gestarten X-Servern.
Fangen wir an und holen uns den Key von robi . Dazu setzen wir am Besten manuell die Display-Variable auf den richtigen Wert
Code:
neutest@ULTRA-01:~> export DISPLAY=:0
anschließend holen wir uns mittels Userwechsel durch sudo und anmelden mit dem Passwort von robi den Key für den X-Server und tragen ihn in unsere .Xauthority Datei ein.
Einfach als User robi den Key für den X-Server in der Variable DISPLAY extrahieren und mittels Pipe weiterleiten, und am anderem Ende der Pipe als User neutest aufnehmen und in die Xauthority einmischen.
Code:
neutest@ULTRA-01:~> sudo -iu robi xauth extract - $DISPLAY | xauth merge -
jetzt können wir hier zB. Firefox starten und User robi wird am Virtuellem Terminal vt7 fluchen, warum hier ein Fenster aufgeht, das er gar nicht gestartet hat.

Das Gleiche dann mit dem anderem User und den Zugang zum anderem X-Server. DISPLAY ändern, und mit Usernamen egon den Key auslesen und lokal speichern.
Code:
neutest@ULTRA-01:~> DISPLAY=:1
neutest@ULTRA-01:~> sudo -iu egon xauth extract - $DISPLAY | xauth merge -
Jetzt brauchen wir nur die DISPLAY-Variable umzustellen und können somit festlegen auf welchem der beiden X-Server die Grafischen Fenster dazu erscheinen sollen.

Das Ganze System einigermaßen verstanden :???: dann kann man es ziemlich universell einsetzen. ;)

robi
 
Oben