Linux
systemd 中的 sudo 等效項
如何強制“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 不會單獨死亡。