
如何强制“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