![允许 sudo 子进程更新以原始用户身份运行的 Zenity](https://linux22.com/image/220738/%E5%85%81%E8%AE%B8%20sudo%20%E5%AD%90%E8%BF%9B%E7%A8%8B%E6%9B%B4%E6%96%B0%E4%BB%A5%E5%8E%9F%E5%A7%8B%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%E7%9A%84%20Zenity.png)
- 由用户“staff”运行的脚本运行
zenity --progress
。 - 然后它调用
sudo -u adminBod adminScript
(并且 STDOUT 和 STDERR 被收集到记录器) - 我希望
adminScript
正在运行的程序adminBod
能够写入 zenity 的 STDIN,以便提供更新。
尝试1
我想我可以将通道 3 连接到 zenity 的 STDIN,然后从我的 sudo 进程写入:
#!/bin/bash
# Main script, run by 'staffer'
{
echo "# Starting work"
exec 3>&1
sudo -u adminBod adminScript 2>&1 | logger -t myTag
exec 3>&-
echo "100" # tells Zenity we're at 100% and it can close
} zenity --progress --auto-close
#!/bin/bash
# adminScript, run by adminBod
echo "# some message for zenity" >/dev/fd/3
echo "# some message for zenity" >&3
这不起作用,因为/dev/fd/3
不存在adminBod
。
尝试2
然后我想我可以使用命名管道,比如
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close <thePipe &
staffer% sudo -u adminBod bash
adminBod% echo '# some update'>/home/staffer/thePipe
这是因为 Zenity 收到消息,但随后它似乎关闭了通道/管道(抱歉不确定正确的术语),以便无法写入进一步的更新。
答案1
使用exec 3>thePipe
让我取得了一些进展......
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close <thePipe &
staffer% sudo -u adminBod bash
adminBod% exec 3>/home/staffer/thePipe
adminBod% echo '# some update' >&3
adminBod% sleep 1
adminBod% echo '# some new update' >&3
adminBod% sleep 1
adminBod% echo '100' >&3 # will close due to --auto-close
adminBod% exit # this will also close '3' and cause zenity to close
但问题是,当 adminBod 会话结束时,管道也结束了。我希望 zenity 在 sudo-ed 子进程结束后继续运行。
我发现exec 3>thePipe
在员工流程中添加一个可以解决这个问题:
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close <thePipe &
staffer% zenityPid=$!
staffer% exec 3>thePipe #