sudo 하위 프로세스가 원래 사용자로 실행되는 Zenity를 업데이트하도록 허용

sudo 하위 프로세스가 원래 사용자로 실행되는 Zenity를 업데이트하도록 허용
  1. 사용자 "직원"이 실행하는 스크립트zenity --progress.
  2. 그런 다음 호출합니다 sudo -u adminBod adminScript(그리고 STDOUT 및 STDERR은 로거에 수집됩니다).
  3. adminScript업데이트를 제공하기 위해 실행 중인 프로그램이 adminBodzenity의 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 세션이 종료되면 파이프라인도 종료된다는 것입니다. sudo 하위 프로세스가 끝난 후에도 zenity가 계속 실행되기를 원합니다.

exec 3>thePipe직원 프로세스에 a를 추가하면 문제가 해결되는 것으로 나타났습니다 .

staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close <thePipe &
staffer% zenityPid=$!
staffer% exec 3>thePipe # 

관련 정보