Linux

systemd 中的 sudo 等效項

  • October 9, 2019

如何強制“machinectl shell”或systemd-run在終端而不是對話框視窗中詢問密碼?

我可以使用以下命令以 root 身份執行命令:

machinectl shell --uid=root --setenv='DISPLAY=:1.0' --setenv=SHELL=/bin/bash .host /bin/bash -lc 'startxfce4'

但它使用對話視窗要求輸入密碼 在此處輸入圖像描述

我想擁有與 sudo 相同的行為(sudo 使用終端詢問密碼,以便我可以輕鬆編寫腳本)

在路上我發現使用 ssh 是這樣的:

ssh -t MyActualNormalUser@localhost

然後執行與上面相同的命令:

machinectl shell --uid=root --setenv='DISPLAY=:1.0' --setenv=SHELL=/bin/bash .host /bin/bash -lc 'thunar'

現在 machinectl 使用終端而不是 GUI 對話視窗詢問密碼! 在此處輸入圖像描述

如何在不使用 ssh 的情況下獲得相同的結果?是否可以強制 machinectl/pkexec 在終端中詢問密碼?

為什麼不使用 sudo?sudo 不要為我執行的命令創建新會話,machinectl 執行一個完全獨立的會話,這使腳本編寫工作更輕鬆。並且當我閱讀 machinectl/pkexec 時,如果我沒記錯的話,su/sudo 替換…

以其他使用者身份執行命令

要以另一個使用者身份執行某些東西,我們有不同的方法:

  • machinectl:這會創建一個單獨的會話
  • ssh:這會創建一個單獨的會話
  • systemd-run:這不會創建單獨的會話,而是創建一個可以像會話一樣控制的單獨服務單元。例如,當我執行時,loginctl session-status我收到此錯誤:Could not get properties: Caller does not belong to any known session,因為沒有會話 ID。
  • pkexec:這不會創建單獨的會話
  • sudo:這不會創建單獨的會話

如何在終端(不是gui)中傳遞密碼

我們可以用:

  • pkexec:這需要 pkttyagent
  • machinectl:這要求使用 gui 輸入密碼,要使用 tty 進行通行證,我們需要 pkexec/sudo 或 ssh
  • systemd-run:這要求使用 gui 輸入密碼,要使用 tty 進行通行證,我們需要 pkexec/sudo 或 ssh
  • sudo : sudo 必須替換為 pkexec
  • ssh:這將需要 root 密碼,或者我們需要使用 pkexec/sudo 或 ssh user@localhost

結論:

只有 machinectl 和 ssh 給了我一個單獨的會話,systemd-run 也不錯,但它是用於腳本而不是用於創建會話。

並獲得root,我們可以使用pkexec

  • 機器控制
   timeout 3s sshpass -e pkttyagent -p $(echo $$) &
   pkexec machinectl shell --uid=root --setenv="DISPLAY=:1.0" --setenv=SHELL=/bin/bash .host /bin/bash -lc "startxfce4"
  • SSH
   timeout 3s sshpass -e pkttyagent -p $(echo $$) &
   pkexec ssh -t root@localhost  "bash -lc  'export DISPLAY=:1.0 ; startxfce4'"
  • 系統執行
   timeout 3s sshpass -e pkttyagent -p $(echo $$) &
   pkexec systemd-run --pty --pipe --wait --collect --service-type=exec --uid=root bash -lc "export DISPLAY=:1.0 ; export SHELL=/bin/bash ; startxfce4"

pkttyagent :需要強制 pkexec 使用終端而不是對話 Gui 來詢問密碼

超時 3s :需要,因為 pkttyagent 不會單獨死亡。

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