GNU/Linux >> LINUX-Kenntnisse >  >> Linux

„Error Constructing Proxy…“ beim Versuch, Gnome-Terminal als Root zu starten?

openSUSE Leap 42.2
Gnome Terminal 3.20.2

Ich habe ein Terminalfenster geöffnet. Wenn ich folgenden Befehl eingebe:

gnome-terminal

als Nicht-Root-Benutzer startet es erfolgreich ein neues Terminal.

Wenn ich den Befehl jedoch als root ausführe, erhalte ich die folgende Fehlermeldung:

Fehler beim Erstellen des Proxys für
org.gnome.Terminal:/org/gnome/Terminal/Factory0:Die Verbindung ist
geschlossen

Wenn ich versuche, das Terminal mit dbus-launch gnome-terminal zu starten dann funktioniert es.

Was verhindert das gnome-terminal Befehl zum Starten des Terminals als root? Und ist dbus-launch eine akzeptable Problemumgehung oder verursacht wahrscheinlich unvorhergesehene Probleme (ich verstehe nicht wirklich, was es tut)?

Akzeptierte Antwort:

Denken Sie daran, wie Windows-Anwendungen hauptsächlich in den Win16-Tagen funktionierten, bevor Win32 auftauchte und es abschaffte:wo es hInstance gab und hPrevInstance , der Versuch, eine zweite Instanz vieler Anwendungen auszuführen, übergab die Dinge einfach an die erste Instanz, und dies erschwerte die Dinge für Befehlsskripting-Tools (wie Take Command), da eine Anwendung ein zweites Mal aufgerufen wurde und sie sichtbar auf der vorhanden war screen als hinzugefügtes Fenster angezeigt, aber soweit es den Befehlsinterpreter betraf, wurde der untergeordnete Prozess, den er gerade ausgeführt hatte, sofort beendet?

Nun, GNOME hat das Win16-Verhalten für Linux zurückgebracht.

GNOME Terminal ist jetzt eine Client-Server-Anwendung. Das gnome-terminal Das Programm ist nur ein Client, der Desktop-Bus-Nachrichten an einen Server erstellt, seine Befehlszeilenoptionen, seine Umgebung, sein Arbeitsverzeichnis und seine Argumente weitergibt und sich dann einfach beendet. Der Server ist gnome-terminal-server die sich als org.gnome.Terminal registriert auf dem Desktop-Bus und der für die gesamte eigentliche Terminalemulation und die Anzeige des/der Fenster(s) auf der/den GUI(s) verantwortlich ist.

Ein Desktop Bus-Client wie gnome-terminal lokalisiert den Desktop-Bus-Broker über eine Umgebungsvariable, die normalerweise auf Sockets in einem Benutzerverzeichnis wie /run/user/1001 zeigt . Alternativ gibt die Umgebungsvariable an, im „Laufzeitverzeichnis des aktuellen Benutzers“ zu suchen, und ein Pfad ähnlich dem oben genannten wird aus der effektiven Benutzer-ID des Client-Prozesses erstellt. Dieses Verzeichnis ist in beiden Fällen normalerweise privat für den einzelnen Benutzer und für andere (nicht privilegierte) Benutzer unzugänglich.

Heiterkeit entsteht, wenn Leute versuchen, gnome-terminal auszuführen als anderer Benutzer über sudo und dergleichen. Wenn die Umgebungsvariable auf ein explizit benanntes Laufzeitverzeichnis zeigt, kann ein nicht privilegierter Client keine Verbindung zum benutzerspezifischen Desktop-Bus herstellen. Wenn die Umgebungsvariable auf das Laufzeitverzeichnis „des aktuellen Benutzers“ zeigt, sucht sie nach dem falschen Desktop-Bus-Broker, häufig nach dem für einen Benutzer, der derzeit keinen hat ein Desktop Bus-Broker, der ausgeführt wird, weil sich der Benutzer nicht angemeldet und die benutzerspezifischen Dienste dieses Benutzerkontos nicht gestartet hat. (Desktop-Bus-Broker pro Benutzer werden von einem Service-Manager pro Benutzer ausgeführt. Der Service-Manager pro Benutzer wird entweder explizit gestartet oder, im Fall einiger Service-Management-Software, durch einige ziemlich hässliche Haken in den Benutzerauthentifizierungsprozess, der von verwendet wird wie das login , su , und SSH-Serverprogramme.)

Der Grund für dbus-launch Für Sie als Superuser hat dieser dbus-launch funktioniert explizit einen anderen Desktop-Bus-Broker gestartet, der als Superuser ausgeführt wird, der gnome-terminal sprechen konnte. Glücklicherweise war das System auch so konfiguriert, dass es den gnome-terminal-server bei Bedarf startete Server, wenn der Client versucht hat, sich über den Broker mit ihm zu verbinden. (Dies ist nicht unbedingt der Fall, und heutzutage wird ein solches Demand-Starting als minderwertiger Mechanismus angesehen, da es dazu führt, dass viele Desktop Bus-Serverprozesse unter keiner Art von Service-Management ausgeführt werden. In der Tat, ohne den Broker selbst unter Dienstverwaltung wird ebenfalls als minderwertig angesehen und wird im Allgemeinen auch nicht als gute Idee für den Superuser angesehen Konto, um diese Art von Diensten auszuführen, da viele von ihnen nicht erwarten, mit Superuser-Rechten ausgeführt zu werden, da sie davon ausgehen, dass sie unter den Ägiden gewöhnlicher Benutzerkonten ausgeführt werden.)

Verwandt:Wie bringt man vim dazu, mit tmux richtig zu arbeiten?

Weitere Heiterkeit entsteht, wenn, wie der Fragesteller bei „Wie kann ich gnome-terminal remote auf meinem Headless-Server starten? (fails to launch over X11 forwarding)“ versucht, gnome-terminal auszuführen wenn nicht einmal der ursprüngliche Benutzer einen Desktop-Bus-Broker ausgeführt hat. Dies passiert beispielsweise, wenn man sich über SSH angemeldet hat, aber der SSH-Anmeldeprozess den benutzerbezogenen Service-Manager nicht startet, was wiederum bedeutet, dass der benutzerbezogene Desktop-Bus-Broker nicht ausgeführt wird, und der gnome-terminal-server Server kann nicht über einen Desktop-Bus erreicht werden. (Je nachdem, wie das System konfiguriert ist, könnte die grafische Anmeldung immer noch das Starten des Dienstmanagers pro Benutzer auslösen, und daher könnte man beobachten, dass die grafische Anmeldung als derselbe Benutzer die Dinge auf magische Weise zum Laufen bringt. Und wieder dbus-launch würde explizit einen nicht vom Dienst verwalteten Desktop-Bus-Broker starten.)

Noch mehr Heiterkeit ergibt sich, wenn einer der Service-Manager die Hooks in login hat , su , und der SSH-Server. Diese Hooks implementieren normalerweise die Semantik zum Starten der Dienstverwaltung pro Benutzer und aller damit gestarteten Dienste pro Benutzer bei der ersten Anmeldung für diesen Benutzer. und stoppen Sie sie alle, um sich für diesen Benutzer abzumelden. Wenn man viele kurzlebige und sich nicht überschneidende SSH-Sitzungen hat, kann viel Overhead entstehen, wenn das gesamte Dienstverwaltungssystem pro Benutzer (und alle seine Autostart-Dienste) nutzlos gestartet und heruntergefahren werden Beginn und Ende jeder dieser SSH-Sitzungen. systemd, einer dieser Dienstmanager, hat einen unvollkommenen „Linger“-Mechanismus, der dies nur halbwegs angeht. Dies bedeutet, dass die Dienstverwaltung pro Benutzer nach der endgültigen Abmeldung „verweilt“, aber nicht verhindert, dass die Dienstverwaltung pro Benutzer überhaupt gestartet wird.

Weiterführende Literatur

  • Jonathan de Boyne Pollard (2016). /run/user/jim/dbus . „Gazetter“. Nosh-Leitfaden . Software. jdebp.eu.
  • Jonathan de Boyne Pollard (2016). „Benutzerbezogene Dienste“. Nosh-Leitfaden . Software. jdebp.eu.
  • Führen Sie echte mehrere Prozessinstanzen von gnome-terminal aus
  • Systemd-Dienst des Benutzers persistent machen
  • https://unix.stackexchange.com/a/323700/5132

Linux
  1. 4 Möglichkeiten zum Deaktivieren des Root-Kontos in Linux

  2. Unterschied zwischen Sudo-Benutzer und Root-Benutzer?

  3. Wenn ich CPAN in Linux Ubuntu verwende, sollte ich es mit sudo / als root oder als meinen Standardbenutzer ausführen

  4. Shell-Befehl in Jenkins als Root-Benutzer ausführen?

  5. Wie erstelle ich einen zusätzlichen Root-Benutzer?

So fügen Sie einen Benutzer zu Ihrem Linux-Desktop hinzu

Linux – Benutzer zur Sudoers-Liste hinzufügen

So beschränken Sie den Root-Benutzer in CentOS

Wie aktiviere ich den Root-Benutzer in Ubuntu Server?

Terminal immer als Root-Benutzer (sudo) in Ubuntu starten

Beim Versuch, den Benutzernamen zu ändern, teilt mir das Terminal mit, dass der Benutzer derzeit vom Prozess verwendet wird