systemd 中的 sudo 等效项

Bad*_*ers 5 linux sudo shell-script systemd pkexec

如何强制“machinectl shell”或systemd-run在终端而不是对话框窗口中询问密码?

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

machinectl shell --uid=root --setenv='DISPLAY=:1.0' --setenv=SHELL=/bin/bash .host /bin/bash -lc 'startxfce4'
Run Code Online (Sandbox Code Playgroud)

但它使用对话窗口要求输入密码 在此处输入图片说明

我想拥有与 sudo 相同的行为(sudo 使用终端询问密码,以便我可以轻松编写脚本)

我发现正在使用 ssh 这样的方式:

ssh -t MyActualNormalUser@localhost
Run Code Online (Sandbox Code Playgroud)

然后运行与上面相同的命令:

machinectl shell --uid=root --setenv='DISPLAY=:1.0' --setenv=SHELL=/bin/bash .host /bin/bash -lc 'thunar'
Run Code Online (Sandbox Code Playgroud)

现在 machinectl 使用终端而不是 GUI 对话框窗口询问密码! 在此处输入图片说明

如何在不使用 ssh 的情况下获得相同的结果?是否可以强制 machinectl/pkexec 在终端中询问密码?

为什么不使用sudo?sudo 不要为我运行的命令创建一个新会话,machinectl 运行一个完全分离的会话,这使脚本编写工作更轻松。当我读到 machinectl/pkexec 时,如果我没记错的话,su/sudo 将被替换...

Bad*_*ers 4

以另一个用户身份运行命令

要以另一个用户身份运行某些东西,我们有不同的方法:

  • 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"
Run Code Online (Sandbox Code Playgroud)
  • SSH
    timeout 3s sshpass -e pkttyagent -p $(echo $$) &
    pkexec ssh -t root@localhost  "bash -lc  'export DISPLAY=:1.0 ; startxfce4'"
Run Code Online (Sandbox Code Playgroud)
  • 系统运行
    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"
Run Code Online (Sandbox Code Playgroud)

pkttyagent :需要强制 pkexec 使用终端而不是对话 Gui 来询问密码

timeout 3s :需要,因为 pkttyagent 不会单独死亡。