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

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

如何强制“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 会被替换...

答案1

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

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

  • 机器控制:这会创建一个单独的会话

  • SSH:这会创建一个单独的会话

  • 系统运行:这不会创建单独的会话,而是创建一个单独的服务单元,该服务单元也可以像会话一样进行控制。例如,当我运行时,loginctl session-status我收到此错误:Could not get properties: Caller does not belong to any known session,因为没有会话 ID。

  • 执行程序:这不会创建单独的会话

  • 须藤:这不会创建单独的会话

如何在终端(不是gui)中传递密码

我们可以用:

  • 执行程序: 这个需要pkttyagent

  • 机器控制:这要求使用 gui 提供密码,要使用 tty 进行传递,我们需要 pkexec/sudo 或 ssh

  • 系统运行:这要求使用 gui 提供密码,要使用 tty 进行传递,我们需要 pkexec/sudo 或 ssh

  • 须藤: 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 来询问密码

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

答案2

解决方案1

您可以使用systemd-ask-password为 bash 变量分配密码。

例子

password=$(systemd-ask-password --echo "machinectl password: ")
machinectl login {{ user }} $password
machinectl shell {{ your command }}

解决方案2

作为 root 用户,您可以使用machinectl --no-ask-password.从文档中:

--不询问密码

不要向用户询问特权操作的身份验证。

参考

https://www.freedesktop.org/software/systemd/man/systemd-ask-password.html https://www.freedesktop.org/software/systemd/man/machinectl.html

相关内容