Opensuse

嘗試以 root 身份啟動 gnome-terminal 時出現“錯誤建構代理…”

  • November 29, 2017

openSUSE Leap 42.2 Gnome 終端 3.20.2

我打開了一個終端視窗。如果我鍵入以下命令:

gnome-terminal

作為非 root 使用者,它成功啟動了一個新終端。

但是,如果我以 root 身份執行命令,則會收到以下錯誤消息:

為 org.gnome.Terminal:/org/gnome/Terminal/Factory0 建構代理時出錯:連接已關閉

如果我嘗試啟動終端,dbus-launch gnome-terminal那麼它可以工作。

是什麼阻止gnome-terminal命令以 root 身份啟動終端?是dbus-launch一種可接受的解決方法還是可能導致無法預料的問題(我不太明白它在做什麼)?

記住在 Win32 出現並取消它之前的 Win16 天,Windows 應用程序主要是如何工作的:在哪裡有hInstancehPrevInstance,嘗試執行許多應用程序的第二個實例只是將事情交給第一個實例,這讓事情變得困難命令腳本工具(如 Take Command),因為它會第二次呼叫應用程序,它會在螢幕上作為添加的視窗可見,但就命令解釋器而言,它剛剛執行的子程序立即退出?

好吧,GNOME 為 Linux 帶來了 Win16 行為。

GNOME 終端現在是一個客戶端-伺服器應用程序。該gnome-terminal程序只是一個客戶端,它將桌面匯流排消息構造到伺服器,傳遞它的命令行選項、環境、工作目錄和參數,然後簡單地退出。伺服器在桌面匯流排上gnome-terminal-server註冊,org.gnome.Terminal負責所有實際的終端仿真和在 GUI 上顯示視窗。

桌面匯流排客戶端gnome-terminal通過環境變數定位桌面匯流排代理,該環境變數通常指向每個使用者目錄中的套接字,例如/run/user/1001. 或者,環境變數指定在“目前使用者的執行時目錄”中查找,並且從客戶端程序的有效使用者 ID 構造類似於上述的路徑。在任何一種情況下,此目錄通常對個人使用者都是私有的,其他(非特權)使用者無法訪問。

gnome-terminal當人們試圖以其他使用者身份執行時,就會出現歡鬧sudo。如果環境變數指向明確命名的執行時目錄,則非特權客戶端無法連接到每使用者桌面匯流排。如果環境變數指向“目前使用者的”執行時目錄,它會查找錯誤的桌面匯流排代理,通常是針對目前沒有執行桌面匯流排代理的使用者,因為該使用者尚未登錄並啟動該代理使用者帳戶的每使用者服務。(每使用者桌面匯流排代理由每使用者服務管理器執行。每使用者服務管理器要麼顯式啟動,要麼在某些服務管理軟體的情況下,login, su, 和 SSH 伺服器程序。)

dbus-launch作為超級使用者為您工作的原因是dbus-launch明確啟動了另一個桌面匯流排代理,以超級使用者身份執行,gnome-terminal能夠與之交談。gnome-terminal-server幸運的是,系統還配置為在客戶端嘗試通過代理連接到伺服器時按需啟動伺服器。(情況不一定如此,如今這種需求啟動被視為一種劣等機制,因為它最終會導致許多桌面匯流排伺服器程序不在任何類型的服務管理下執行。事實上,沒有代理本身在服務管理下也被認為是劣質的。對於超級使用者來說,這通常也不是一個好主意帳戶來執行這些類型的服務,因為他們中的許多人不希望以超級使用者權限執行,因為他們希望在普通使用者帳戶的支持下執行。)

如果像“如何在我的無頭伺服器上遠端啟動 gnome-terminal?(無法通過 X11 轉發啟動)gnome-terminal ”的提問者那樣,如果即使原始使用者沒有桌面匯流排代理,人們也會嘗試執行跑步。例如,當一個人通過 SSH 登錄但 SSH 登錄過程沒有啟動每使用者服務管理器時,就會發生這種情況,這反過來意味著每使用者桌面匯流排代理沒有執行,並且gnome-terminal-server伺服器不能通過桌面匯流排到達。(根據系統的配置方式,圖形登錄仍然可以觸發啟動每個使用者的服務管理器,因此人們可能會觀察到,以同一使用者的圖形登錄神奇地使事情正常進行。再說一次dbus-launch將顯式啟動非服務管理的桌面匯流排代理。)

login然而,當一個服務經理與su, 和 SSH 伺服器。這些鉤子通常實現啟動每使用者服務管理的語義,以及它啟動的所有每使用者服務,在該使用者首次登錄時;並在該使用者最後註銷時停止它們。如果一個人有很多短暫且不重疊的 SSH 會話,那麼在啟動和關閉整個每使用者服務管理系統(及其所有自動啟動服務)時可能會產生大量成本每個 SSH 會話的開始和結束。systemd,一個這樣的服務管理器,有一個不完美的“逗留”機制,實際上只有一半解決了這個問題。這意味著每使用者服務管理在最終註銷後“徘徊”,但它根本不會停止每使用者服務管理的啟動。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/344617