允许 sudo 子进程更新以原始用户身份运行的 Zenity

允许 sudo 子进程更新以原始用户身份运行的 Zenity
  1. 由用户“staff”运行的脚本运行zenity --progress
  2. 然后它调用sudo -u adminBod adminScript(并且 STDOUT 和 STDERR 被收集到记录器)
  3. 我希望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 # 

相关内容